概述
硬體加速
當前市面上幾乎所有的顯示卡都具備一定的視頻
硬體加速能力。微軟公司為此專門制訂了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系列開始。
視頻實現
MC加速
MC加速+iDCT加速
MC加速+iDCT加速+VLD[1]加速
[1]VLD: Variable-Length Decoding,即可變長度解碼
解碼器
MPC-HC: 繼承了歷史悠久的開源播放器MPC的衣襟,並在其基礎上增加了許多實用功能
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
Windows XP用戶,必須使用VMR9
Windows Vista/7用戶,必須使用EVR custom renderer
在 選項(Options)/播放(Playback) 中,勾上 自動裝載字幕(Auto-load subtitles)
支持視頻
可以通過軟體來檢測:DXVAChecker
說了那么多,其實只是想說
視頻加速解碼真是個複雜的東西。需要硬體,
解碼器,視頻本身等多方面的支持方可促成視頻硬解。雖然複雜,但這是值得的。通過視頻加速解碼,我們可以將CPU從繁重又重複的工作中解放出來,讓它在別的地方發揮自己的性能,以及讓那些由於CPU性能孱弱但有一塊還不錯的顯示卡的電腦同樣可以享受高清視頻。
壓制篇(
x264版)接下來將介紹如何壓制一個能使絕大多數
硬體加速解碼方案都支持的視頻 使用的編碼器是x264,它是一個效率非常高的開源編碼器,基於
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。