Я пытаюсь кодировать видео с помощью MF H.265, и независимо от того, что я пытаюсь, качество всегда ниже, чем видео с одинаковыми настройками, передаваемое не кодировщиками MF, как, например, то, что использует VideoPad (скажем, ffmpeg) в тот же самый битрейт 4000.
Видеопад производит это видео плавательного мальчика. Мое приложение производит это видео. Небо в моем приложении явно хуже при битрейте 6K, где VideoPad на 1K.
pMediaTypeOutVideo->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pMediaTypeOutVideo->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_HEVC);
pMediaTypeOutVideo->SetUINT32(MF_MT_AVG_BITRATE, 4000000);
MFSetAttributeSize(pMediaTypeOutVideo, MF_MT_FRAME_SIZE, 1920,1080);
MFSetAttributeRatio(pMediaTypeOutVideo, MF_MT_FRAME_RATE, 25, 1);
MFSetAttributeRatio(pMediaTypeOutVideo, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
pMediaTypeOutVideo->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
pMediaTypeOutVideo->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_Wide);
CComPtr<ICodecAPI> ca;
hr = pSinkWriter->GetServiceForStream(OutVideoStreamIndex, GUID_NULL, __uuidof(ICodecAPI), (void**)&ca);
if (ca)
{
if (true)
{
VARIANT v = {};
v.vt = VT_BOOL;
v.boolVal = VARIANT_FALSE;
ca->SetValue(&CODECAPI_AVLowLatencyMode, &v);
}
if (true)
{
VARIANT v = {};
v.vt = VT_UI4;
v.ulVal = 100;
hr = ca->SetValue(&CODECAPI_AVEncCommonQualityVsSpeed, &v);
}
if (true)
{
VARIANT v = {};
v.vt = VT_UI4;
v.ulVal = eAVEncCommonRateControlMode_Quality;
ca->SetValue(&CODECAPI_AVEncCommonRateControlMode, &v);
if (true)
{
VARIANT v = {};
v.vt = VT_UI4;
v.ulVal = 100;
ca->SetValue(&CODECAPI_AVEncCommonQuality, &v);
}
}
}
Несмотря ни на что, качество при 4000k остается хуже, чем у ffmpeg. Также eAVEncCommonRateControlMode_Quality
и CODECAPI_AVEncCommonQuality
, кажется, не вступают в силу (это работает в H.264). Единственный способ улучшить качество - повысить битрейт.
Кроме того, параметр скорости, похоже, не влияет на качество или скорость кодера.
Даже при 1000k видео, произведенное Videopad, не влияет иметь пикселизацию в небе. Конечно, его скорость равна 1/100.
Кодеры Media Foundation хуже, чем у ffmpeg? Чего мне не хватает?
Редактировать: Рендеринг с программным обеспечением (MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS
в FALSE) также одинаково плох.
Обновление: попробовал на моем ноутбуке с аппаратным кодером AMD. Аналогичная проблема, когда битрейт низкий, качество ужасное.