DXVA和psp
硬件加速介紹篇
DirectX視頻加速簡介:
DirectX視頻加速(DirectX Video Acceleration/DXVA)是微軟在Windows以及Xbox 360平台上的一種API技術規範,它允許通過硬件加速視頻解碼。以管線方式,將CPU疲於處理的運算,諸如反餘弦變換(iDCT)、運動補償(Motion Compensation)和反交錯(Deinterlacing)等,交給GPU完成。DXVA 2.0能讓更多的運算實現硬件加速,包括視頻捕捉和處理。DXVA在顯卡(Video Card)的視頻渲染模塊中工作。在Windows 2000中,DXVA 1.0作為一個標準的API被引入,並且在Windows 98以及之後的Windows中依然可用。DXVA 1.0可在覆蓋合成器(Overlay Rendering Mode)或VMR 7/9運行。DXVA 2.0,僅在Windows Vista、Windows 7以及之後的微軟作業系統中可用,與Media Foundation合併,並且在MF(Media Foundation)中使用的是增強型視頻渲染器(Enhanced Video Renderer/EVR)。 視頻解碼器為硬件加速解碼和渲染特別定義了一條特殊的解碼管線以使用DXVA。CPU分析流媒體並轉換成DXVA兼容的數據結構。DXVA定義了一組可硬件加速的運算。除此之外,還定義了一組可以讓圖形驅動實現運算加速的硬件驅動接口(Device Driver Interfaces/DDIs)。如果解碼器需要用到任何DXVA已支持的運算,那麼通過調用這些接口,它便可實現運算的硬件加速。如果圖形驅動未能調用這些接口,它將會返回給解碼器進行軟解碼。然後已解碼的視頻輸出給視頻渲染設備。
DXVA的實現
DXVA有三種視頻加速級別
- MC加速
- MC加速+iDCT加速
- MC加速+iDCT加速+VLD[1]加速
[1]VLD: Variable-Length Decoding,即可變長度解碼
幾種常見的支持DXVA的播放器或解碼器
- 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)
支持DXVA的視頻
可以通過軟件來檢測:DXVAChecker
說了那麼多,其實只是想說視頻加速解碼真是個複雜的東西。需要硬件,解碼器,視頻本身等多方面的支持方可促成視頻硬解。雖然複雜,但這是值得的。通過視頻加速解碼,我們可以將CPU從繁重又重複的工作中解放出來,讓它在別的地方發揮自己的性能,以及讓那些由於CPU性能孱弱但有一塊還不錯的顯卡的電腦同樣可以享受高清視頻。
壓制篇(x264版)
接下來將介紹如何壓制一個能使絕大多數硬件加速解碼方案都支持的視頻 使用的編碼器是x264,它是一個效率非常高的開源編碼器,基於H.264標準設計。
H.264的規格分類
首先H.264的視頻按照標準被分為幾個規格
Profile在x264中被分為baseline/main/high (Profile越高級,支持越多的高級特性,成品的壓縮率越高)
x264相關參數:--profile 可強制指定Profile,一般情況下可不選,x264將會根據其他參數自行設定此項。如果設置此項,x264將會自動無視所設Profile無法支持的高級特性。
特性支持表:http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles
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]。
具體規格詳見:http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels
[2]DPB,即Decoded Picture Buffer。
兼容性
目前,隨着軟硬件的發展,播放硬件加速播放高清視頻對視頻本身的限制越來越小,有些甚至已經宣稱支持 High Profile @ Level 5.1。但這些畢竟只有少數軟硬件支持,為考慮支持更普遍的硬件加速方案。推薦壓制視頻不超過 High Profile @ Level 4.1。此規格被絕大多數主流硬件加速播放方案支持。
相關參數
因為大多數方案已經支持 High Profile。因此我們只需着重考慮Level對硬件加速的兼容。 Level與DPB以及碼率息息相關。而DPB與解像度(resolution)、參考幀(ref)相關。
DPB的參考幀限制公式: ref=Min(Floor(MaxDpbMbs / (PicWidthInMbs * FrameHeightInMbs)), 16)
MaxDpbMbs:
Level | 1 | 1b | 1.1 | 1.2 | 1.3 | 2 | 2.1 | 2.2 | 3 | 3.1 | 3.2 | 4 | 4.1 | 4.2 | 5 | 5.1 |
MaxDpbMbs | 396 | 396 | 900 | 2,376 | 2,376 | 2,376 | 4,752 | 8,100 | 8,100 | 18,000 | 20,480 | 32,768 | 32,768 | 34,816 | 110,400 | 184,320 |
PicWidthInMbs * FrameHeightInMbs(解像度) 舉個例子:寬為1920時,PicWidthInMbs=120;高為1080時,FrameHeightInMbs=68。其它解像度按比例計算即可。
常見高清視頻視頻解像度參考幀限制:
Level 4.1 1920x1080: 4 1440x1080: 5 1280x960 : 6 1280x720 : 9 960x720 : 12
關於碼率,BD原盤都是Level 4.1,那壓出來的東西一般不會超過原盤吧。
如果你有特別需求需要限制的話,可用 --vbv-maxrate 和 --vbv-bufsize 。
另外有些視頻雖然標註 High Profile @ Level 5.1,但實際上這些視頻也同樣滿足Level 4.1的限制。但由於一些解碼方案直接讀取視頻的中壓制者強制寫入的Level信息,而導致無法播放。這時,我們不必重新壓制,可以使用roozhou所修改的ffmpeg來簡單的更改視頻中的Level信息。
地址:ffmpeg
使用範例(命令行):
>ffmpeg -i input.mkv -vcodec copy -acodec copy -vbsf h264_changesps=level=41 output.mkv
參考文獻: