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

问题描述 投票:1回答:2

我正在尝试使用MF H.265编码视频,无论我如何尝试,其质量始终低于非MF编码器所要求的相同设置的视频,例如VideoPad在相同的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。

硬件NVIDIA编码器是否比基于软件的ffmpeg差?我想念什么?

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

c++ winapi ms-media-foundation
2个回答
0
投票

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

enter image description here

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


0
投票

也许仅仅是因为软件编码器比硬件编码器要好。

[如果我看一下:https://www.techspot.com/article/1131-hevc-h256-enconding-playback/page7.html,与x265(2016年日期)相比,我还将确认硬件nvidia编码器是错误的。

我无法进行更多调查,但是根据我对您的帖子的了解:

  • pMediaTypeOutVideo-> SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE,MFNominalRange_Wide); ->为什么不选择MFNominalRange_Normal?
  • 还有NVidia编码器提供的ICodecAPI,而不是CODECAPI_AVLowLatencyMode / CODECAPI_AVEncCommonQualityVsSpeed / CODECAPI_AVEncCommonRateControlMode ...
  • 2遍编码参数在哪里?

我发现至少三个论坛说NVidia HEVC编码器使图像模糊。并且您确认了这一点,所以...是否为假新闻,(日期为2018/2019)。]

来自NVidia https://developer.nvidia.com/nvidia-video-codec-sdk#NVENCFeatures(日期未定义)。>>

enter image description here

我对此图一无所知,但NVidia似乎假装它们是最好的...所以还是假新闻。

谁是最好的...

询问NVidia,它们通常应该告诉您最佳的Mediafoundation设置,以获取正确的视觉视频,而不会造成模糊...从我的NVidia论坛经验中,您可以等待很长时间才能得到答案...

© www.soinside.com 2019 - 2024. All rights reserved.