2016-10-22 52 views
0

我正在写一个应用程序,实时记录PC的屏幕,并使用Media Foundation h264编码解码器进行编码。如果屏幕上的图片没有很多动态变化,则所得视频的质量会保持较高水平。如果图片有很多动态变化(例如网页的快速滚动),则视频质量会变得非常低。这听起来像是一个低比特率的问题,但参考OSX录制应用程序工作正常,具有相同的设置。媒体基金会h264编码器动态场景质量差

编解码器的配置:

  • 25帧
  • 1364×768分辨率
  • 基线分布
  • 1.2兆比特的比特率

为了最大限度地提高质量,我配置了以下参数的编解码器:

  • CODECAPI_AVEncCommonRateControlMode = eAVEncCommonRateControlMode_Quality
  • CODECAPI_AVEncCommonQuality = 100
  • CODECAPI_AVEncAdaptiveMode = eAVEncAdaptiveMode_FrameRate
  • CODECAPI_AVEncMPVGOPSize = 10

不幸的是,这并没有太大的帮助。唯一具有实际效果的设置是比特率。

一个例子视频,演示该问题: https://www.dropbox.com/s/b26odaeyaygxigo/10-22-2016_15.08.17.mp4?dl=1

+0

嗨,你确定问题是媒体基金会h264编码器?什么是PC的桌面屏幕的来源? –

+0

使用IDirect3DSurface9捕获PC的屏幕,然后按原样输入到IMFSinkWriter。没有理由为什么压缩失真应该出现在这个管道中,而不是在编码器中。 –

+0

嗨,我认为与编码器的问题。您设置的分辨率几乎为FULL HD的低比特率。您比较OSX h264和Media Foundation h264编码器,但它是两个不同的公司。规格h264保证来自OSX h264和Media Foundation h264编码器的视频可以播放,但IT不保证相同的质量。更重要的是,来自微软的视频和音频编码器以质量差和优化不佳而着称 - 例如,Windows 10中的h265编码器 - 它只能在x64下工作,但在x86中它会抛出异常并使应用程序崩溃。 –

回答

0

你需要这个步骤来设置比特率和质量:

VARIANT controlModeVar; 
InitVariantFromUInt32(eAVEncCommonRateControlMode_GlobalVBR, 
&controlModeVar); 
hr = CodeApi->SetValue(&CODECAPI_AVEncCommonRateControlMode, 
&controlModeVar); 
VARIANT quality; 
InitVariantFromUInt32(BitRate, &quality); 
hr = CodeApi->SetValue(&CODECAPI_AVEncCommonMeanBitRate, 
&quality); 

InitVariantFromUInt32(eAVEncCommonRateControlMode_Quality, 
&controlModeVar); 
hr = CodeApi->SetValue(&CODECAPI_AVEncCommonRateControlMode, 
&controlModeVar); 
InitVariantFromUInt32(H264QualityLevel, &quality); 
hr = CodeApi->SetValue(&CODECAPI_AVEncCommonQuality, &quality); 

最小OS需要的Windows8。