2016-10-22 119 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。