gpt4 book ai didi

c++ - 低质量的H.265 Media Foundation编码?

转载 作者:行者123 更新时间:2023-12-01 14:58:12 26 4
gpt4 key购买 nike

我正在尝试使用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_QualityCODECAPI_AVEncCommonQuality似乎没有生效(在H.264中有效)。要获得更好的质量,唯一的方法是提高比特率。

同样,速度参数似乎并不影响质量或编码器速度。

即使使用1000k Videopad制作的视频在天空中也没有像素化。当然,它的速度是1/100。

Media Foundation编码器是否比ffmpeg的编码器差?我想念什么?

编辑:使用软件( MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS到FALSE)进行渲染也同样糟糕。

更新:我的笔记本电脑使用AMD硬件编码器对其进行了尝试。类似的问题,当比特率较低时,质量很差。

最佳答案

我用MediaInfo检查了两个视频,很明显它们使用了不同的HEVC配置文件,这应该是影响NVidia编码视频质量的主要原因。
这是比较屏幕截图:

enter image description here

您可以尝试将输入的IMFMediaType中的MF_MT_VIDEO_PROFILE设置为eAVEncH265VProfile_Main_420_8。另外,MF_MT_MPEG2_LEVEL也应相应设置。例如到eAVEncH265VLevel4_1。

您也可以考虑使用IClassFactory approach来保证调用ICodecAPI方法的正确顺序。

关于c++ - 低质量的H.265 Media Foundation编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59785818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com