Monday, May 19, 2008

H.264/AVC硬體解碼: Media Player Classic搭配PowerDVD

零. 前言

H.264視訊編碼已經誕生好一陣子了,其挾著高度的壓縮能力與畫質,與微軟提出的VC-1編碼,一同成為了次世代藍光光碟使用的編碼之一(HD DVD R.I.P)。但由於H.264的運算方式極為複雜,現階段若要以個人電腦中上等級的CPU,採用軟體解碼方式播放高流量、高解析度的H.264影片,是相對吃力的,更別說運算能力較低的CPU,發生影片播放不順暢、影音不同步的情況,是常有的。因此主流的顯示卡廠商:AMD/ATinVIDIA,提出了以顯示卡晶片硬體解碼的解決方案,將解碼工作轉交顯示卡GPU處理,大幅減輕CPU的負擔,以利電腦多工作業。這種做法類似以往借助MPEG-2加速卡播放DVD一樣。

AMD/ATi與nVIDIA的硬體解碼目標,主要針對市面上正版的藍光光碟。本文則展示如何利用Media Player Classic,搭配這兩家的顯示卡,以及CyberLink PowerDVD的H.264解碼器,直接在Media Player Classic中開啟顯示卡的硬體解碼功能,讓使用者可以順暢播放在網路上找到的H.264影片,並說明當中可能碰到的問題和限制。

一. 準備工作

本教學文使用了下列軟硬體:

1.1 ATi Radeon HD 3450

目前具備H.264硬體解碼功能的顯示卡,在AMD/ATi方面主要為Radeon HD 2400/2600系列,以及3000全系列,在此使用的是3000系列的小老弟3450。至於高階的2900系列則沒有此功能,請注意。nVIDIA的產品GeForce 8400 GS以上全部都有硬體解碼功能。

  • 雖然被顯示成3400 Series,可是它確實是Radeon HD 3450喔,在此搭配ATi官方驅動程式,Catalyst 8.4版
在整合性顯示晶片中,自然首推AMD的780G。上一代的690G也可以,但效能較差。nVIDIA到目前為止還沒有看到足以抗衡的產品。

1.2 CyberLink PowerDVD 7 Deluxe

硬體解碼並非顯示卡插上後就會自動開啟,還需要適當的播放軟體配合,這方面的首選,自然是CyberLink PowerDVD。PowerDVD從版本7開始,任一版的豪華版(Deluxe)皆具有H.264解碼器,可以直接啟動硬體解碼功能,在此便是要把該H.264解碼器借過來,交給Media Player Classic使用。相關的版本比較請參照PowerDVD官方產品說明頁

若你仔細看了以上的產品說明頁,鐵定會發現:所有版本的PowerDVD中,只有8 Ultra才能播放藍光光碟,其他版本的,就算有H.264解碼器,卻不支援藍光光碟。依我的推測,應該是卡在HDCP的解密功能,這表示8 Ultra以外的版本只能播放零星的EVOTS/M2T這類從藍光光碟rip出來的檔案,或是有人自行土炮壓製的MP4,雖然這類影片是X版的機會很大,且PowerDVD更無法播放自由軟體社群推廣的MKV檔案。

不管怎麼說,就算咱們要放X版影片,PowerDVD依舊是商業軟體,需要花錢買的。若你在網路上看到有人散佈PowerDVD的H.264解碼器,請小心點用。

  • 我很乖,因為我買了PowerDVD。身為一個愛看電影的人,會買一份專用的播放軟體也是很合理的。請多支持優良國產軟體。
1.3 Media Player Classic

如之前所言,因為PowerDVD沒辦法通吃網路上可以找到的檔案,所以我們祭出了Media Player Classic,相信大家對這玩意很熟悉了。通常你不會直接安裝這軟體,而是隨著編碼包一起安裝的。此外,為了播放MKV、MP4、EVO、TS這類非Windows原生的檔案,你需要Haali Media Splitter搭配使用。如果你還不太清楚這是怎麼一回事,請參考本站之前的教學文:編碼包導覽 以CCCP與Real Alternative Lite為例(上篇)(下篇)

二. 操作步驟

將以上軟硬體安裝好後,首先啟動Media Player Classic,由工作選單選取View->Options,進入左方Playback->Output欄目,Windows XP使用者請將DirectShow Video的render調整成VMR9(windowed)Vista使用者則選用EVR

  • 我還在用Windows XP,所以EVR(Enhanced Video Renderer)選項看不到。但遽聞目前在Vista下,EVR跟nVIDIA GeForce 8500/8600的配合度有點問題,若你碰到不正常的狀況,請改用VMR9(windowed)。
接著從左方切到External Filters欄目,一般來說會看到空盪盪的內容,先按右側的Add Filter:

從蹦出來的Select Filter視窗,找到CyberLink H.264/AVC Decoder,按OK加入:

回到External Filters視窗,將CyberLink H.264/AVC Decoder的優先度調整至Prefer

為了確認CyberLink H.264/AVC Decoder會將資料丟給顯示卡處理,這時在其上雙擊滑鼠左鍵,在跳出來的設定視窗中,確定DxVA選項有被勾選起來。它的全名是DirectX Video Acceleration,功能夠明顯了吧。
由於我自己還裝了H.264軟體解碼用的CoreAVC,為求慎重起見,我用同樣的方式將它加入,並將它Block。FFDShow使用者也請至FFDShow Video Decoder Configuration將其對H.264的支援關掉,以免發生解碼器搶優先權的強況:

以上幾個步驟就設定完成了,按下確定鈕離開,接著播放影片實際測試。

三. 影片測試

在此的測試環境是Windows XP Pro SP3,CPU為雙核心的AMD Opteron 165,搭配2G的RAM,並於放影片時關掉不必要的常駐程式。首先牛刀小試一番,放個流量小,解析度不高,有點幼年向的MP4檔案(XD):

  • CPU的使用率在10%左右附近跳動,偶爾跳到20%左右,但平均使用率依然很低,由系統內容可以看到,CPU更發慌到運作時脈由原本的1.8GHz降至1GHz左右節省電量,所以硬體解碼應該是成功了。
接著播放由Apple下載的Iron Man電影預告片,採用Apple Quicktime的MOV格式封裝,解析度達1280*544:

  • 本片的解析度與流量比前一個卡通片高上了許多,雖然CPU的時脈恢復到了額定的1.8GHz左右,但使用量還是非常低,圖為Iron Man發射飛彈的英姿。(還要你說喔,吼)
為了繼續壓榨Radeon HD 3450,我們播放解析度更高的片子,同為自Apple下載,近期就要上演的The Chronicles of Narnia: Prince Caspian,解析度達1920*816,已經近乎逼近Full HD的規格了:

  • 就算播放如此規格的影片,顯示卡的硬體解碼依然讓你的CPU遊刃有餘,使用率低得可以。
如果你想加確定硬體解碼的功能是否開啟,可以在播放影片時,選擇Media Player Classic工作選單的Play->Filters->Video Mixing Render 9 (Windowed),切換到Pin Info項目,檢查視訊資料被處理時的路徑資訊:

  • 在這可以看到VMR9接收了由CyberLink H.264/AVC Decoder解碼後送來的資料,且顯示方式為DXVA,表示硬體解碼成功。
四. 失敗案例

並非所有的H.264影片都可以被硬體解碼的,在這展示兩個失敗的例子。我們繼續播放The Chronicles of Narnia: Prince Caspian預告片,但自行編寫一個外部的SSA字幕檔,讓VSFilter掛上:

  • 掛上外部字幕檔以後,CPU的使用量很明顯暴增了許多,從Video Mixing Render 9 (Windowed)的Pin Info可以看到,這時VMR9並非接收CyberLink H.264/AVC Decoder的資料了,而是DirectVobSub,也就是VSFilter。這是由於在影片的出輸路徑中,倒數第二關是DirectVobSub接收H.264 Decoder的資料,替影片上字幕,最後再由VMR9顯像。由於DirectVobSub夾在H.264 Decoder與VMR9之間,導致顯示卡的硬體解碼功能無法開啟,因此硬體解碼失敗。由VMR9輸出的影片格式亦可知道,這時不再是DXVA格式了,而是YUY2 color space
還有一個雖然沒有字幕,但卻無法正常硬體解碼的例子,這是網路上找到的Matroska檔案,由動畫社群土炮壓製的Gundam 00開頭動畫,解析度為1920*1080,已經符合Full HD的標準:

  • 本片由板友xelnaga提供。
在這個例子中,CPU使用率雖然有效下降,確實是用硬體解碼,但卻發生畫面破碎的情況。可能原因有兩個,第一:我用的Radeon HD 3450有問題。這不是不可能,前陣子的Radeon HD 2400系列就發生了不少瑕疵,導致硬體解碼不正常。另一個原因,也是我認為比較可能的,就是本片沒有依照H.264的profile參數壓製。簡單來說,H.264編碼制定時,有不同的「profile」,各profile又有不同的「level」,在此姑且稱之為「規範」與「層級」。不同層級與規範,各自適用於不同的用途。有的適合在手機、PSP等,以較低流率與解析度播放,有的適合藍光光碟的高解析度影片,有的適合數位電視傳送,各有不同的壓縮參數設定。若影片在壓製時,某些參數的的設定值超出了規範的合理範圍,就可能無法用硬體解碼。這樣的情況依舊可以用DVD的MPEG-2影片類比:並非每一個MPEG-2影片扔到DVD中就可以用獨立的DVD player播放,就算你可以在電腦上正常放映它,因為DVD影片有應有的規範,不合乎規範的MPEG-2檔案,就過不了DVD player的解碼晶片這一關。關於H.264的規範與層級,可以參考本Wiki說明頁

以上顯現了硬體解碼很大的缺點:不穩定、使用彈性低,而這方面就是軟體解碼的優點,只要CPU夠強,任何影片都可以用軟體解碼處理,且軟體更新方便,要照著規範走很容易,甚至可以處理體制外的東西。同一個Gundam 00檔案,改用效率一流的CoreAVC解碼,就能正常播放了:

  • 用Opteron 165還有CoreAVC硬幹,並沒有比硬體解碼差到哪去,雖然CPU使用率增高了不少,在VMR9方面影片解析度還從1920*1080被誤判成2048*1080,可是實際播放上沒有任何問題,非常順暢。
還有一種片子不太可能開啟硬體解碼,就是放在AVI檔案中的H.264。由於AVI先天不支援H.264在壓縮時採用的b frame,AVI必須經過些許破解才能放入H.264,而這完全是標準規範外的事。碰到這種檔案,除了軟體解碼以外,沒有別的法子。

2007/5/22更新:外掛字幕成功

經由AVEncode板板友sdbb的提醒,利用Media Player Classic的內部外掛字幕功能,而不要透過VSFilter,或許可以在搭配外部字幕檔的情況下,順利開始硬體解碼。在測試後,這個方法確實可行。

首先利用前文說明的方式,將Video Render由VMR9(windowed)更改為VMR9(renderless)。測試片依舊是The Chronicles of Narnia: Prince Caspian預告片:

  • 切換到VMR9(renderless)之後,硬體解碼同樣正確開啟,但一播放影片時,卻發生片子的畫面比例被扭曲的問題,雖然在稍稍拉動Media Player Classic視窗後,就恢復正常了,播放依舊順暢。目前不清楚這是什麼問題造成的。
接著就可以啟用Media Player Classic自身內部的外掛字幕功能了,從選單File->Load Subtitle,找尋字幕檔案,就能掛上字幕:

  • 這時就算掛上字幕檔,硬體解碼功能也不會被干擾了,VMR9(renderless)的輸出視訊顯示為DXVA,而CPU的使用率近乎沒有超過20%過,表示硬體解碼成功。請注意在這裡的字幕檔檔名特地改成與影片檔不一樣,否則VSFilter會自己蹦出來當電燈泡。
伍. 结語

本文展示了如何利用Media Player Classic與PowerDVD 7 Deluxe的元件,開啟Radeon HD 3450顯示卡的H.264硬體解碼功能,以及當中所遭遇的問題。硬體解碼雖能有效降低CPU的使用率,但在某些情況,依舊不如軟體解碼來得方便。如果電腦的配備能力許可,請盡量使用軟體解碼,以免產生本人在撰寫本文跑影片測試時,發生的當機問題(XD)。

其實前一陣子在網路上出現了一個計畫,稱為Media Player Classic - Homecinema,內建了網路社群編寫的H.264解碼器,可以直接開啟硬體解碼,不需要PowerDVD的協助,在外掛字幕方面也更方便,雖然目前整體運作尚未穩定,但其日後的發展,應是值得期待的。

4 comments:

Anonymous said...

不知道站長哪一天會評測終極解碼2008春節版? :)

cation234@ptt.cc said...

沒有使用的東西就不會測試了

Kanemitsu168 said...

Hello,依照站長的說明,設定好Media Player Classic,試著Play MTS檔,CPU loading很低,有聲音,但無畫面,不知如何解決?(VGA card為ASUS ATI 2400 Pro 256MB). TKS!

cation234@ptt.cc said...

先由更新播放軟體與顯示卡驅動程式下手 如果每部片子都如此 且其他人可以順利硬體解碼的片子也開不成 那就送修顯示卡吧