首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >低质量H.265媒体基础编码?

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

Stack Overflow用户
提问于 2020-01-17 18:45:29
回答 2查看 739关注 0票数 2

我正在尝试用MF H.265编码视频,无论我尝试什么,质量总是比非MF编码器获得的相同设置的视频质量要低,比如VideoPad在相同4000比特率下使用的视频(比如ffmpeg)。

Videopad制作一个游泳男孩的this视频。我的应用程序会生成this视频。在我的应用程序中,6K码率的天空显然更糟糕,而VideoPad只有1K。

代码语言:javascript
复制
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硬件编码器在我的笔记本电脑上试用。类似的问题是,当比特率很低时,质量很糟糕。

EN

回答 2

Stack Overflow用户

发布于 2020-01-20 02:04:06

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

您可以尝试将输入IMFMediaType中的MF_MT_VIDEO_PROFILE设置为eAVEncH265VProfile_Main_420_8。此外,还应相应地设置MF_MT_MPEG2_LEVEL。例如发送到eAVEncH265VLevel4_1。

为了保证调用ICodecAPI方法的正确顺序,您还可以考虑使用IClassFactory approach

票数 0
EN

Stack Overflow用户

发布于 2020-01-21 08:12:25

也许很简单,因为软件编码器比硬件编码器更好。

如果我看一下这个: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...
  • Where是2遍编码参数之外,还有其他来自NVidia编码器的编码参数吗?

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

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

我对这张图一无所知,但NVidia似乎假装他们是最好的……不管是假新闻还是假新闻。

编辑

使用软件进行

渲染(将MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS设置为FALSE)也同样糟糕。

你能在软件模式下确认所使用的H.265 / HEVC Video Encoder吗?

如果是,您是否使用了编解码器属性?

  • 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59785818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档