概述
硬體加速
當前市面上幾乎所有的顯示卡都具備一定的視頻硬體加速能力。微軟公司為此專門制訂了DXVA規範(包括DXVA 1.0和DXVA 2.0兩個版本)。但使用硬體加速,在視頻播放的總體流程上也受到諸多限制,尤其是後期處理部分。因此對於追求後期效果的高清發燒友,寧可放棄硬體加速,當然代價可能是需要升級CPU甚至整個系統。 DXVA規範中,不同的顯示卡的視頻硬體加速能力有差異,有的顯示卡支持的加速項目較多,有的顯示卡支持的較少,從顯示卡的發展歷程來看,視頻硬體加速能力總體是逐漸增強的,但在同一代顯示卡中,高端顯示卡的視頻硬體加速能力不見得比低端顯示卡的強,甚至有些時候還會弱些。 對於高清發燒友來說,可以接觸到的高清視頻源的編碼格式主要有MPEG2, H.264和WMV和VC-1四種。DXVA 1.0規範里最早定義了MPEG2和WMV硬體解碼能力,在DXVA 2.0里又增加了H.264和VC-1硬體解碼能力。
視頻硬體解碼能力的成功運用,需要幾個環節的配合。首先,顯示卡硬體需要支持特定的視頻編碼格式;其次,顯示卡驅動需要正確的報告顯示卡硬體的這種能力;最後,視頻解碼器需要能夠啟用這種能力(這可能會進一步涉及到分離器和渲染器的配合)。當然,視頻源本身也必須是這種編碼格式。
還有一點需要特別注意的是,DXVA是一種接口規範,顯示卡硬體支持DXVA規範,不代表就實現了裡面所有的功能,但是肯定的一點是,無論什麼功能,顯示卡驅動的DXVA部分代碼一定會告訴系統,這項功能它實現了還是沒有實現,這是DXVA規範強制性要求的。好處是系統不需要自己去測試顯示卡有沒有實現這項功能。解碼器支持DXVA規範,不代表就能利用DXVA規範裡面所有的功能組合,它可以選擇自己有能力支持的,或者想要支持的那些功能組合,其他功能組合也許就放棄了。還有,某顯示卡雖然表示支持某種能力,但如果解碼器認為這個能力的支持不夠穩定,容易導致系統崩潰或錯誤,或者性能低下,它也可以放棄這種能力。
硬解能力級別
DXVA2_ModeH264_A (DXVA2_ModeH264_MoComp_NoFGT)
DXVA2_ModeH264_B (DXVA2_ModeH264_MoComp_FGT)
DXVA2_ModeH264_C (DXVA2_ModeH264_IDCT_NoFGT)
DXVA2_ModeH264_D (DXVA2_ModeH264_IDCT_FGT)
DXVA2_ModeH264_E (DXVA2_ModeH264_VLD_NoFGT)
DXVA2_ModeH264_F (DXVA2_ModeH264_VLD_FGT)
DXVA2_ModeMPEG2_IDCT
DXVA2_ModeMPEG2_MoComp
DXVA2_ModeMPEG2_VLD
DXVA2_ModeVC1_A (DXVA2_ModeVC1_PostProc)
DXVA2_ModeVC1_B (DXVA2_ModeVC1_MoComp)
DXVA2_ModeVC1_C (DXVA2_ModeVC1_IDCT)
DXVA2_ModeVC1_D (DXVA2_ModeVC1_VLD)
DXVA2_ModeWMV8_A (DXVA2_ModeWMV8_PostProc)
DXVA2_ModeWMV8_B (DXVA2_ModeWMV8_MoComp)
DXVA2_ModeWMV9_A (DXVA2_ModeWMV9_PostProc)
DXVA2_ModeWMV9_B (DXVA2_ModeWMV9_MoComp)
DXVA2_ModeWMV9_C (DXVA2_ModeWMV9_IDCT)
視頻硬體解碼的能力的級別從高到低的順序如下,能力越高,顯示卡能夠分擔的視頻解碼計算量就 越多。
VLD(視頻bitstream處理)->IDCT(幀內壓縮)->MoComp(幀間壓縮)->PostProc(後期處理)
VLD級別的解碼包含IDCT, MoComp和PostProc,
IDCT級別的解碼包含MoComp和PostProc
MoComp級別的解碼包含PostProc
對於H.264編碼,還有一個稱為FGT(Film Grain Technology)的技術,即所謂膠片感,目的是在不 犧牲壓縮能力的同時保持視頻源特有的顆粒信息。
功能
視頻解碼對於我們普通用戶來說可以分成兩類,一類是以CPU為核心的軟體解碼,另一類就是如今主流的以GPU為核心的硬體加速解碼。
就目前來看,二者各有利弊。
軟體解碼好處是,第三方軟體解碼器齊全通用性高,使用CPU來作為解碼核心能夠滿足幾乎所有的視頻解碼。而壞處也顯而易見,在一台CPU性能較弱的平台上,尤其是在看高碼率的高清視頻時,CPU由於執行緒數和自身架構導致的效能上不足,視頻畫面卡、頓、慢成為不可避免的結局。
硬體加速解碼好處是,如今主流顯示卡都能夠很好的支持主流視頻格式解碼,尤其是在圖形核心採用統一架構後,利用圖形核心的並行架構設計,在H.264和VC-1格式高清視頻上有絕佳的支持效果。弊端是,硬體解碼受限視頻播放總體流程,尤其是後期處理部分。所以很多追求最終畫質效果的高清發燒友,寧可放棄硬體(GPU)加速解碼的幾倍性能,而選擇基於CPU的軟體解碼。
根據DXVA的規範制定,硬體加速解碼可分為四個級別,它們由高到低分別是:
VLD(bitstream方面的處理)>IDCT(幀內壓縮)>MoComp(幀間壓縮)>PostProc(顯示後處理)
從上面的等級分布上不難看出,VLD加速等級最高,所以其包含IDCT、MoCoopm和PostProc;IDCT加速次之,包含MoCoopm和PostProc;最後MoComp加速僅包含PostProc。
對於僅支持MC加速的顯示卡只有在2005年以前的老產品上出現,當NVIDIA進入GeForce 6000系列和AMD進入Radeon X800系列後,圖形核心的硬體加速能力達到了IDCT加速級別。而當顯示卡進入圖形核心統一架構設計後,GeForce 8000和Radeon HD 2000開始進入目前最高的VLD加速。
不過值得一提的是,由於NVIDIA的高清硬體加速功能基於Video Pocesser單元設計,而最早出現的GeForce 8800系列(G80核心產品)沒有開放此功能單元設計,所以NVIDIA真正進入VLD加速是從2007年4月發布的GeForce 8600/8500系列開始 。
視頻實現
DXVA有三種視頻加速級別
MC加速
MC加速+iDCT加速
MC加速+iDCT加速+VLD[1]加速
[1]VLD: Variable-Length Decoding,即可變長度解碼
解碼器
PowerDVD(CyberLink): 著名的商業播放器
Nvidia PureVideo: 從名字就可以看出,Nvidia公司出品的視頻解碼器
MPC-HC: 繼承了歷史悠久的開源播放器MPC的衣襟,並在其基礎上增加了許多實用功能
PotPlayer: 原Kmplayer作者開發的另一款播放器
ffdshow: 著名的開源編解碼器,功能強大,內置了許多實用濾鏡,在最近的版本中加入了DXVA模組
在當前,雖然有許多播放器支持DXVA解碼,但綜合考慮MPC-HC是最為實用並且方便實用的。首先MPC-HC是開源軟體,其次MPC-HC是綠色軟體,無需安裝即可使用,再則MPC-HC內置的字幕濾鏡比起其他播放器,對ASS/SSA的支持度最高。因此接下來著重介紹MPC-HC
MPC-HC的DXVA對顯示卡的限制:
nVidia 8(9)xxx系列,僅支持H.264
ATI Radeon HD系列,支持H.264和VC-1
Intel G45,僅支持H.264
在未來,MPC-HC可能會增加對運動補償模式的支持,以兼容更多古老的顯示卡。但在當前,還不支持MPEG2和WMV的硬體加速。
由於DXVA的限制,所使用的渲染器必須遵守以下規則:
Windows XP用戶,必須使用覆蓋合成器(Overlay Mixer),VMR 7或VMR9作為視頻渲染器(Video Renderer)
Windows Vista/7用戶,必須使用增強型視頻渲染器(Enhanced Video Renderer/EVR)或EVR custom renderer
MPC-HC視頻解碼器必須直接連線視頻渲染器,因此中間無法插入DirectVobSub或ffdshow之類的濾鏡。 在DXVA模式中,外掛字幕可以通過MPC-HC內置的字幕濾鏡來顯示,但是對渲染器的要求更苛刻
Windows XP用戶,必須使用VMR9
Windows Vista/7用戶,必須使用EVR custom renderer
在 選項(Options)/播放(Playback) 中,勾上 自動裝載字幕(Auto-load subtitles)
支持視頻
可以通過軟體來檢測:DXVAChecker
說了那么多,其實只是想說視頻加速解碼真是個複雜的東西。需要硬體,解碼器,視頻本身等多方面的支持方可促成視頻硬解。雖然複雜,但這是值得的。通過視頻加速解碼,我們可以將CPU從繁重又重複的工作中解放出來,讓它在別的地方發揮自己的性能,以及讓那些由於CPU性能孱弱但有一塊還不錯的顯示卡的電腦同樣可以享受高清視頻。
壓制篇(x264版)接下來將介紹如何壓制一個能使絕大多數硬體加速解碼方案都支持的視頻 使用的編碼器是x264,它是一個效率非常高的開源編碼器,基於H.264標準設計。
規格分類
首先H.264的視頻按照標準被分為幾個規格
Profile在x264中被分為baseline/main/high (Profile越高級,支持越多的高級特性,成品的壓縮率越高)
x264相關參數:--profile 可強制指定Profile,一般情況下可不選,x264將會根據其他參數自行設定此項。如果設定此項,x264將會自動無視所設Profile無法支持的高級特性。
Level被分為1/1.1/1.2/1.3/2/2.1/2.2/3/3.1/3.2/4/4.1/4.2/5/5.1 (Level越高,對解析度/參考幀/碼率的限制越小)
x264相關參數:--level 可強制指定Level,一般情況下可不選,x264將會根據實際情況自行設定此項,但自動設定並不一定準確。如果設定此項,x264將會自動限制DBP[2]。
[2]DPB,即Decoded Picture Buffer。