【发布时间】:2020-01-17 10:45:29
【问题描述】:
我正在尝试使用 MF H.265 对视频进行编码,无论我尝试什么,质量总是低于非 MF 编码器产生的相同设置的视频,例如 VideoPad 使用的(比如 ffmpeg)相同的 4000 比特率。
Videopad 制作this 游泳男孩的视频。我的应用程序生成 this 视频。我的应用程序中的天空在 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 硬件编码器。类似的问题,码率低的时候画质很差。
【问题讨论】:
-
您能否将 Nvidia 编码器和其他编码器生成的文件与 MediaInfo 进行比较,看看它们可能有哪些其他差异?
-
@VuVirt 问题已编辑以包含视频。
-
您使用的转换是什么?在我的系统上,我只看到用于 H265 的 Intel 和 nVidia MFT,两者都是基于硬件的。使用 topoedit,我可以看到英特尔 MFT 的 CodecApi 属性是 AVEncCommonBufferSize、AVEncCommonQualityVsSpeed 等。您能否提供您尝试使用的转换的所有 CodecAPI 属性和当前值?
标签: c++ winapi ms-media-foundation