繁体   English   中英

低质量 H.265 媒体基础编码?

[英]Low quality H.265 Media Foundation encoding?

我正在尝试使用 MF H.265 对视频进行编码,无论我尝试什么,质量始终低于非 MF 编码器生成的相同设置视频,例如 VideoPad 在相同的 4000 下使用的(例如,ffmpeg)比特率。

Videopad 制作了这个游泳男孩的视频。 我的应用程序制作了这个视频。 我的应用程序中的天空在 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 编码视频质量的主要原因。 下面是对比截图:

在此处输入图片说明

你可以尝试设置MF_MT_VIDEO_PROFILE在你输入IMFMediaType到eAVEncH265VProfile_Main_420_8。 此外,MF_MT_MPEG2_LEVEL 也应相应设置。 例如 eAVEncH265VLevel4_1。

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

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

如果我看看这个: https : //www.techspot.com/article/1131-hevc-h256-enconding-playback/page7.html ,我也会确认硬件 nvidia 编码器是坏的,与 x265(日期 2016)相比)。

我无法进行更多调查,但从我对您的帖子的看法来看:

  • pMediaTypeOutVideo->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_Wide); -> 为什么不是 MFNominalRange_Normal ?
  • 除了 CODECAPI_AVLowLatencyMode/CODECAPI_AVEncCommonQualityVsSpeed/CODECAPI_AVEncCommonRateControlMode 之外,还有其他来自 NVidia 编码器的 ICodecAPI 吗?
  • 2 pass encoding 参数在哪里?

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

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

在此处输入图片说明

我对这张图一无所知,但 NVidia 似乎假装他们是最好的......所以假新闻与否。

编辑

用软件渲染(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS 到 FALSE)也同样糟糕。

您能否在软件模式下确认使用的H.265 / HEVC 视频编码器

如果是这样,你玩过 Codec Properties 吗?

  • CODECAPI_AVEncCommonRateControlMode
  • CODECAPI_AVEncCommonMeanBitRate
  • CODECAPI_AVEncCommonBufferSize
  • CODECAPI_AVEncCommonMaxBitRate
  • CODECAPI_AVEncMPVGOPSize
  • CODECAPI_AVLowLatencyMode
  • CODECAPI_AVEncCommonQualityVsSpeed
  • CODECAPI_AVEncVideoForceKeyFrame
  • CODECAPI_AVEncVideoEncodeQP
  • CODECAPI_AVEncVideoMinQP
  • CODECAPI_AVEncVideoMaxQP
  • CODECAPI_VideoEncoderDisplayContentType
  • CODECAPI_AVEncNumWorkerThreads

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM