[泡泡網顯卡頻道 2009年7月9日]自2005年高清視頻在很短的時間內流行起來之後,關於高清視頻的解碼方法就成為了越來越多玩家關注的對象,而顯卡高清視頻解碼技術更是玩家們關注的重中之重。理由很簡單,相對於CPU軟解碼來說,使用顯卡進行高清視頻解碼投資更小、收益更大。
回顧高清視頻的發展之路,可以說GPU高清解碼完全是隨著高清視頻的發展而發展的。早在Geforce 6時代,GPU就集成了專門的高清視頻解碼模塊,當時高清視頻在國內才剛剛萌芽。隨著高清視頻的發展,GPU的高清解碼技術也隨之向前推進,現在的顯卡已經完全可以實現硬體解碼任何高清視頻。
但是,對於絕大部分普通用戶來說,使用顯卡進行高清視頻解碼時,解碼器的複雜設置仍然是一大難題,在很多時候我們都可能遇到對於不同編碼格式的視頻進行解碼,需要反覆的對解碼器進行調校設置,有時候對於專業用戶來說都是一大難題,更不說普通用戶。難道,就沒有辦法改變這個局勢嗎?答案顯然是否定的!
日前,CUDA解碼技術正式推出,GPU高清視頻解碼步入了流處理器解碼時代,和以往任何解碼技術都不同,CUDA解碼技術直接調用GPU中的流處理器進行解碼運算,而之前一直是調用GPU中相應的專用視頻解碼模塊。看起來,這樣的說法非常拗口,而且非常難以理解,不用著急,下文我們就將深入淺出的來為你解釋這一切!
大家知道,在早期視頻的解碼工作一直都是依靠CPU來完成,顯卡只是負責解碼後視頻數據的輸出。而高清視頻開始出現之後,NVIDIA和ATI都紛紛推出了利用GPU進行高清視頻解碼的技術。想必對這方面比較了解的朋友來說,PureVideo-HD和AVIVO-HD這兩個詞都不會感到陌生。GPU視頻解碼的誕生就是為了解決因為高清視頻運算量大,中低端CPU根本跑不動的問題,而且顯卡的價格相對於CPU來說也更加便宜,用戶投資更小。
在Geforce 6時代、Geforce7以及Geforce 8800時代,NVIDIA第一代高清視頻解碼技術出現,從那時開始,GPU內集成了專門用於視頻解碼的模塊——Video Processor,一直到現在為止,GPU內都還有這個模塊。NVIDIA第一代高清視頻解碼可以執行視頻解碼過程中的後面兩個步驟,由於運算量最大的步驟依然是CPU在進行處理,故雖然從一定程度上分擔了CPU的任務,但CPU佔有率依然很高,並不成熟。
PureVideo HD第一代(Geforce 7)只能執行解碼過程中的後兩步,到了Geforce8600,8500&8400時代,H.264視頻已經可以為完全硬解,VC-1視頻可以執行前三個步驟;G98之後的GPU均可實現H.264、VC-1完全硬解碼
到了G8x(不包括G80)時代之後,NVIDIA在GPU中加入了VP2(第二代Video Processor)模塊,實現了H.264視頻的完全硬體解碼。但是,對於VC-1視頻卻無法完全硬解,視頻解碼的第一個步驟——Bitstream Processing(比特流處理)仍然必須由CPU來處理,而這個步驟恰好是最消耗資源的一步;所以,NVIDIA在G98之後改進了BSP(專門用於執行比特流處理運算)引擎,使其能夠完全硬體解碼VC-1,至此,N卡高清視頻解碼看似已經完美了。
然而在實際的使用過程中,使用GPU進行高清視頻解碼卻經常會出現這樣那樣的問題,特別是由於解碼器設置不當,導致播放視頻的時候出現不能硬解、或者視頻明顯不正常的情況出現,特別是一些比較老的高清視頻,非常容易出現這樣的問題;另外,H.。所以,對於高清視頻解碼時解碼器的設置就成了很多用戶非常頭疼的一件事情。不管是NVIDIA的顯卡,還是ATI的顯卡,都有可能出現這些問題。
為什麼會出現如上一頁中描述的那些問題呢?要回答這個問題,我們還得從一個叫做DXVA的東西談起。因為,DXVA工作與否正是決定當前視頻是否在使用硬體解碼的標誌。
「DXVA」全稱是DirectX Video Acceleration(硬體視頻加速接口),它是一個由微軟和圖形晶片廠商聯合定義的一個硬體接口規範,就好象DirectX 3D是遊戲開發的應用程式接口一樣,DXVA就是視頻硬體解碼的程序接口,顯卡的視頻單元必須滿足DXVA的規範和要求才能實現相應的功能。
DXVA_ModeH264_AH264_ADXVA_ModeH264_BH264_BDXVA_ModeH264_CH264_CDXVA_ModeH264_DH264_DDXVA_ModeH264_EH264_EDXVA_ModeH264_FH264_FDXVA_ModeVC1_AVC1_ADXVA_ModeVC1_BVC1_BDXVA_ModeVC1_CVC1_CDXVA_ModeVC1_DVC1_D不過需要注意的是,DXVA是一個具有「分級」特性的標準。簡單的理解就是硬體支持DXVA的級別,而不僅僅只有「支持」與「不支持」兩個檔次。從上面的表中我們可以看出,DXVA對H.264視頻硬體加速有6種級別,而對於VC-1視頻有四種級別。
DXVA不僅僅對顯卡的支持度進行了分級,而且對解碼器的支持度也進行了分級,也就是說解碼器即使支持DXVA,也不一定能夠實現DXVA中所有的功能。而由於目前視頻封裝格式非常混亂,就極容易出現一些不可預知的問題。如果對DXVA這個標準進行評價的話,既有好評也有壞評,好評是微軟直接提供了硬體加速與解碼器之間的橋梁,而壞評就是其要求十分嚴格,導致我們前面所說的一些問題。
前面我們說到,DXVA是導致使用GPU硬解碼出現問題的根本原因,如果要解決這個問題,最好的辦法是脫離DXVA,比如CPU解碼就不會出現什麼問題,而且畫質也非常好,這就是因為CPU軟解碼不需要DXVA(DXVA是硬體加速標準)。那麼,有沒有辦法利用顯卡模擬CPU進行解碼呢?——CUDA做到了這一點。
對於CUDA這個名詞相信各位都不會陌生,簡單的說就是NVIDIA顯卡的通用計算技術,CUDA可以直接使用GPU來進行CPU很難完成的複雜運算,理論上來說可以運行任意CPU運算的程序。而且由於CUDA程式語言和C語言基本沒有區別,所以CUDA很快就被全世界各個行業所接受。
在視頻領域,我們之前經常都說到了利用CUDA進行視頻編碼,比如我們之前測試過的Cyberlink MediaShow,vReveal MotionDSP,ArcSoft TotalMedia Theatre以及MediaCoder等。但是視頻解碼一直由於GPU內有專門的運算模塊,導致這一領域幾乎無人問津。而日前,CoreAVC推出了1.9.x版本的解碼器,正式加入了CUDA視頻解碼的功能。
CoreAVC官方網站上1.9.5版本的廣告已經赫然出現了CUDA標誌
CoreAVC是非常流行的H.264解碼器之一,幾乎所有集多種解碼器於一身的播放器都帶有CoreAVC解碼器。今年2月份,CoreAVC率先發布了1.9.0版本的解碼器,首次支持CUDA解碼H.264視頻,不過由於當時存在一些播放色塊的問題,很快CoreAVC就推出了1.9.5版本的解碼器,從此H.264高清視頻解碼正式邁入CUDA時代。
我們知道,CUDA是一個完整的NVIDIA GPGPU解決方案,它直接提供了硬體的訪問接口,而不必通過圖形API來實現GPU硬體的訪問。也就是說,CUDA從某種意義上模擬了CPU的計算。而使用CUDA進行高清視頻解碼的原理也就不難理解了!實際上,使用CUDA進行高清視頻解碼,就是通過調用GPU中龐大的流處理器資源,進行視頻解碼運算,並不是調用GPU中專門的視頻處理單元。
視頻解碼的運算量雖然不高,但是對處理器的並行處理效率有很高的要求,這就是為什麼多核心CPU高清視頻解碼的效率比單核高很多的原因。而使用CUDA進行解碼,GPU中有很多的流處理器資源可以調用,所以使用CUDA進行視頻解碼運算,簡直是輕而易舉。而且由於運算量不高,解碼計算基本不可能讓GPU全速工作,所以在功耗方面也能得到有效的控制。
另外,由於採用CUDA架構,GPU視頻解碼不再需要通過DXVA進行硬體加速,所以可以徹底脫離DXVA的各種限制,從某種意義上模擬CPU進行運算,不僅可以獲得非常完美的兼容性,而且畫質也和CPU軟解沒有什麼區別,設置起來也更加方便。
MediaCoder也只有編碼過程採用CUDA技術
再來我們還可以談到CUDA視頻轉碼這件事情上,我們知道視頻的轉碼過程實際上就是解碼——編碼的過程,而之前部分即使採用CUDA進行視頻轉碼,但解碼過程仍然是CPU來完成,只有編碼過程由CUDA來完成,這樣實際上還是沒有完全利用到GPU的優勢。
對於國內的高清視頻用戶來說,終極解碼和完美解碼是最受歡迎的兩大播放器,均已超強的視頻格式兼容度而聞名。但是,在使用CUDA進行解碼的時候,我們還必須在播放軟體的解碼設置中專門開啟才能夠使用。下面我們首先來看看終極解碼中如何開啟CUDA高清視頻(H.264)解碼。
目前,終極解碼的最新版本為2009春節版,遺憾的是終極解碼已經很久沒有更新,其內置的CoreAVC解碼器為1.85版,而不是最新支持CUDA解碼的1.95版,所以我們必須通過Hack的手段,讓CoreAVC 1.95進入終極解碼的懷抱。
首先,在CoreAVC官方網站下載CoreAVC 1.95版解碼器,普通用戶可直接下載14天的試用版本,有需求的用戶也可以花費14.95美元購買正式版。然後安裝CoreAVC 1.95(如上圖)。
點擊查看大圖
安裝完畢之後,進入CoreAVC的安裝目錄,筆者這裡是C:\\Program Files\\CoreCodec\\CoreAVC 14 Day Trial Edition,找到文件CoreAVCDecoder.ax,將其複製一份到桌面;然後,將桌面上的CoreAVCDecoder.ax文件更改名為CoreAVC.ax,並覆蓋完美解碼安裝目錄下\\Codecs文件夾下,如筆者這裡為C:\\Program Files\\Final Codecs\\Codecs,提示同名文件請選擇覆蓋(如上圖)。
此時,我們已經通過Hack的方法將終極解碼內置的CoreAVC 1.8.5解碼器替換成1.9.5解碼器了,不過我們還需要在播放器裡設置才能正確使用CoreAVC 1.9.5解碼器。
正確覆蓋文件之後,打開終極解碼的「解碼中心」,在H.264視頻解碼器下面的CoreAVC上點右鍵,然後選擇CoreAVC 1.8.5,因為我們剛剛已經將1.8.5的CoreAVC文件替換成CoreAVC 1.9.5的文件了,所以這裡勾選CoreAVC 1.8.5實際上也就是採用了CoreAVC 1.9.5解碼器,只是終極解碼無法識別罷了。
在這裡設置完畢之後,播放器就會自動調用1.9.5版本的CoreAVC解碼器,不過我們還需要在播放器裡開啟CUDA硬體解碼。
點擊放大
打開「我的播放器」(KMPlayer)並隨便播放一段H.264格式視頻,在播放窗口中點擊右鍵——濾鏡——CoreAVC Video Decoder(如上圖),進入CoreAVC設置界面。
上圖才是CoreAVC的設置界面,這裡我們要勾選右下角的Prefer CUDA acceleration才能夠完整開啟CUDA解碼功能。該選項上面的Use Tray Icon可以讓CoreAVC的狀態出現在系統託盤處。
如上圖所示,如果使用CUDA進行視頻解碼的話,系統託盤處的CoreAVC狀態會顯示為綠色(反之會顯示為藍色),滑鼠移動過去會提示CUDA in use字樣,表示正在使用CUDA進行視頻解碼運算。
由於終極解碼目前還沒有正式支持CoreAVC 1.9.5解碼器,必須通過Hack的方法才能夠實現,對於普通用戶來說難免有些麻煩,故暫不推薦使用終極解碼進行CUDA硬解H.264視頻。
前面我們介紹了使用終極解碼進行CUDA硬解H.264視頻的方法,相對來說完美解碼就要方便多了,軟體本身就已經採用了CoreAVC 1.9.5版本的解碼器,下面我們還是來簡單的講述一下。
安裝完美解碼最新版本之後,首先打開「完美解碼設置中心」程序,找到H.264視頻解碼器,將解碼器設置為CoreAVC(如上圖),這樣就調用了CoreAVC 1.9.5版本的解碼器。
應用之後,點擊H.264視頻解碼器右邊的配置,和前面介紹的終極解碼一樣,勾選Prefer CUDA acceleration和Use Tray Icon,開啟CUDA硬體解碼和系統託盤提示。
如果沒有問題的話,此時應該已經可以使用完美解碼進行CUDA視頻解碼了。
● 測試平臺
首先,我們應該明確本次測試目的何在。通過前面的介紹,我們已經了解了目前H.264視頻不僅僅可以通過CPU硬扛、PureVide硬解,還可以通過CUDA硬體解碼,我們本次的測試的目的也就是要看看CUDA解碼的優劣何在,到底是否實用。
本次我們將主要圍繞CUDA解碼H.264視頻時的CPU佔用率和使用CUDA進行視頻解碼對電腦功耗的影響以及CUDA是否與顯卡的遊戲性能有關三個方面進行測試,為了更加方便,本次直接採用支持CUDA硬體解碼的播放器完美解碼進行測試。
部分讀者可能會提到前文我們所說的兼容性和畫質方面的問題,由於筆者手裡都是一些較新的高清視頻,不管是使用GPU解碼還是CUDA解碼,都沒有兼容性問題,所以沒有辦法測試。不過前面筆者給大家分析過,CUDA解碼H.264視頻實際上是模擬CPU進行「軟」解碼,從理論上講完全不會有任何兼容性問題,畫質方面也不會有任何影響,和CPU理論上完全一樣。所以這方面大可不必擔心。
本次測試影片選擇的是《007大破量子危機》1080P H.264版本,採用TS封裝,CPU佔用率測試場景為固定的1分鐘視頻(1小時08分——1小時09分),可以非常準確的體現出各種解碼模式下CPU的佔用率。
首先,我們來看看使用CPU軟體解碼時,播放這個視頻的平均CPU佔用率(測試截取其中一分鐘的平均CPU佔用率)。
● 解碼器設置
解碼器設置方面,視頻渲染器我們選擇VMR9無渲染(修正黑邊)模式,H.264視頻解碼器選擇默認的System,該選項默認為CPU軟體解碼。
點擊查看大圖
從測試結果來看,使用CPU軟體解碼該H.264視頻,平均CPU佔用率為40.96%,雙核心E8200的性能還是不容忽視的,播放高清視頻基本沒有什麼問題。
使用CPU軟體解碼時,CPU平均佔用率為40.96%,下面我們在看看通過GPU中的PureVideo HD單元解碼相同的高清視頻,CPU佔用率為多少。
● 解碼器設置
由於硬體解碼渲染器必須為EVR增強渲染,所以在這裡我們選擇了EVR增強渲染(C/A)模式,H.264解碼器選擇的是CyberLink(DXVA),該解碼器是從PowerDVD 8中提取出來的GPU硬體解碼器,非常好用。
點擊放大
測試結果很明顯,使用GPU中的PureVideo單元解碼這段高清視頻,平均CPU佔用率僅為2.28%,可以看出此時CPU僅僅在處理一些程序本省運行的計算,視頻解碼完全沒有參與。
最重要的是看看使用CUDA進行硬體解碼H.264視頻時,CPU的佔用率情況。
● 解碼器設置
如我們前面所介紹,由於CUDA解碼不需要DXVA,所以渲染器我們也不需要必須選擇EVR增強視頻渲染,這裡選擇兼容性很好的VRM9無渲染(修正黑邊),和CPU軟解時的選擇一樣。H.264解碼器選擇CoreAVC,並打開CUDA視頻解碼。
點擊放大
經過測試,使用CUDA進行視頻解碼時,CPU的平均佔用率為4.88%,相比CPU軟解碼時CPU佔用率低了很多,但是表現不如PureVideo解碼。
為了更加徹底的了解CUDA視頻解碼時對整機功耗的影響,我們還特地對三種解碼方式時的系統功耗進行了測試,以得出最省電的高清視頻解決方案。和之前我們測試功耗的方法一樣,本次仍然採用的是一款功耗測試儀,記錄整機功耗。
採用功耗表進行測試
測試結果和我們預料的差不多,使用CPU軟體解碼時的功耗最大,而使用顯卡PureVideo視頻處理單元解碼的功耗最小,使用CUDA調用流處理器解碼雖然功耗也比較低,但是相對於PureVideo解碼來說,還是要高一些。
前面我們已經看過了使用CUDA進行高清視頻解碼的方方面面,但對於很多用戶來說,CUDA高清視頻解碼的性能會不會受到顯卡遊戲性能的影響也很重要,筆者專門找來了幾款主流顯卡進行測試。
這部分測試所採用的視頻為《購物狂的異想世界》,解析度仍然為1080P,採用TS封裝格式。下面是當今熱門顯卡的測試成績:
由於筆者手裡沒有比9600GSO更低的顯卡,所以未能加入如9400GT、9500GT等的測試成績。從上面的柱狀圖可以看出,不管是高端的GTX275,還是主流級的9600GSO,在使用CUDA進行視頻解碼時,CPU佔用率百分比都沒有什麼區別,數字上的差異完全在誤差範圍之內,可以看出GPU遊戲性能(流處理器數量)基本不會影響CUDA解碼H.264視頻的性能表現。
不過,根據國外一些媒體的測試,9400GT等這些採用16個流處理器的顯卡,在使用CUDA解碼H.264視頻的時候,CPU佔用率會高一些。實際上,由於計算量並不龐大,CoreAVC在工作的時候也僅僅是利用了GPU中的一小部分流處理器資源,所以主流以上級別顯卡都沒什麼差距。
看完前面長篇大論的介紹,相信各位對CUDA高清視頻解碼已經有了一個比較深刻的認識和了解。從本次的測試部分結果來看,使用CUDA進行高清視頻解碼無疑是目前最好的折中方案,由於不受DXVA的限制,使用CUDA解碼在兼容性、畫質方面要明顯好於傳統的GPU硬解碼——PureVideo HD,另一方面在效能和功耗方面領先CPU很多倍。
前面我們已經介紹過使用CUDA進行視頻解碼的優勢,然而實際上,使用CUDA進行高清解碼的好處還遠不止這些。首先,我們再也不必頻繁的在解碼器設置中頻繁的改變設置來解決兼容性問題,使用CoreAVC幾乎可以完美解碼所有H.264視頻。就拿「完美解碼」這款軟體來舉例,我們只需要將H.264的解碼設置成CoreAVC並開啟CUDA加速、VC1的解碼開啟微軟WMV硬體加速、MPEG2視頻使用CyberLink DXVA硬體加速,就可以實現一勞永逸的解碼器設置方案,幾乎可以完美播放所有高清視頻。
完美解碼的解碼器一勞永逸設置方案
另一方面,CUDA解碼還有一大好處就是能獲得視頻數據流,從而在此基礎上進行後處理或者轉碼運算,比如 TotalMedia Theatre倍線,MotionDSP運動補償,Badaboom轉碼都直接採用了CUDA解碼以及CUDA編碼的方案,所以轉換效率非常高。而PureVideo解碼無法獲得視頻數據流,其輸出的數據只能輸出到屏幕上,沒有辦法再進行後期處理。
第三,雖然目前中高端CPU軟解高清視頻已經不費吹灰之力了,但這是在正常速度下播放高清視頻時才能實現這麼好的效果,但如果用高倍速播放高清視頻呢呢,CPU照樣不堪重負。比如,視頻轉碼的時候,其實就是高倍速處理視頻,此時即便四核也忙得不可開交,如果能將這部分運算交給GPU CUDA處理,速度自然更快,效率更高,消除了轉碼瓶頸。
照這樣來看,如果第三方播放軟體能進一步優化的話,相信基於CUDA解碼器的倍線等一系列技術都能在終極解碼或完美解碼上實現。
如果要說CUDA解碼視頻的缺點的話,想必目前最大的缺點就是無法支持VC-1以及MPEG2編碼格式的視頻,這與CoreAVC解碼器本身只是針對H.264解碼的根本特性有關。不過筆者相信,在未來肯定會有解碼器廠商推出基於CUDA的VC-1視頻解碼器。另一方面,由於CUDA僅僅支持G8x之後的NVIDIA DX10顯卡架構,所以該解碼方法Geforce 6、Geforce 7以及A卡用戶均沒有辦法享受。
總體來看,使用CUDA進行高清視頻解碼在原有的PureVideo HD解碼方式基礎上,給了用戶另一個非常好的選擇,而其能直接獲得視頻數據流的特性想必也會被更多廠商所利用。如果說GPU完全硬解高清視頻是視頻解碼的一次革命的話,那麼使用CUDA進行高清視頻解碼絕對可以算得上是又一次革命。■<