為什么會(huì)出現(xiàn)如上一頁(yè)中描述的那些問(wèn)題呢?要回答這個(gè)問(wèn)題,我們還得從一個(gè)叫做DXVA的東西談起。因?yàn),DXVA工作與否正是決定當(dāng)前視頻是否在使用硬件解碼的標(biāo)志。
“DXVA”全稱是DirectX VIDEo AccelerATIon(硬件視頻加速接口),它是一個(gè)由微軟和圖形芯片廠商聯(lián)合定義的一個(gè)硬件接口規(guī)范,就好象DirectX 3D是游戲開發(fā)的應(yīng)用程序接口一樣,DXVA就是視頻硬件解碼的程序接口,顯卡的視頻單元必須滿足DXVA的規(guī)范和要求才能實(shí)現(xiàn)相應(yīng)的功能。
DXVA_ModeH264_A | H264_A |
DXVA_ModeH264_B | H264_B |
DXVA_ModeH264_C | H264_C |
DXVA_ModeH264_D | H264_D |
DXVA_ModeH264_E | H264_E |
DXVA_ModeH264_F | H264_F |
DXVA_ModeVC1_A | VC1_A |
DXVA_ModeVC1_B | VC1_B |
DXVA_ModeVC1_C | VC1_C |
DXVA_ModeVC1_D | VC1_D |
不過(guò)需要注意的是,DXVA是一個(gè)具有“分級(jí)”特性的標(biāo)準(zhǔn)。簡(jiǎn)單的理解就是硬件支持DXVA的級(jí)別,而不僅僅只有“支持”與“不支持”兩個(gè)檔次。從上面的表中我們可以看出,DXVA對(duì)H.264視頻硬件加速有6種級(jí)別,而對(duì)于VC-1視頻有四種級(jí)別。
DXVA不僅僅對(duì)顯卡的支持度進(jìn)行了分級(jí),而且對(duì)解碼器的支持度也進(jìn)行了分級(jí),也就是說(shuō)解碼器即使支持DXVA,也不一定能夠?qū)崿F(xiàn)DXVA中所有的功能。而由于目前視頻封裝格式非;靵y,就極容易出現(xiàn)一些不可預(yù)知的問(wèn)題。如果對(duì)DXVA這個(gè)標(biāo)準(zhǔn)進(jìn)行評(píng)價(jià)的話,既有好評(píng)也有壞評(píng),好評(píng)是微軟直接提供了硬件加速與解碼器之間的橋梁,而壞評(píng)就是其要求十分嚴(yán)格,導(dǎo)致我們前面所說(shuō)的一些問(wèn)題
前面我們說(shuō)到,DXVA是導(dǎo)致使用GPU硬解碼出現(xiàn)問(wèn)題的根本原因,如果要解決這個(gè)問(wèn)題,最好的辦法是脫離DXVA,比如CPU解碼就不會(huì)出現(xiàn)什么問(wèn)題,而且畫質(zhì)也非常好,這就是因?yàn)镃PU軟解碼不需要DXVA(DXVA是硬件加速標(biāo)準(zhǔn))。那么,有沒(méi)有辦法利用顯卡模擬CPU進(jìn)行解碼呢?——CUDA做到了這一點(diǎn)。
對(duì)于CUDA這個(gè)名詞相信各位都不會(huì)陌生,簡(jiǎn)單的說(shuō)就是NVIDIA顯卡的通用計(jì)算技術(shù),CUDA可以直接使用GPU來(lái)進(jìn)行CPU很難完成的復(fù)雜運(yùn)算,理論上來(lái)說(shuō)可以運(yùn)行任意CPU運(yùn)算的程序。而且由于CUDA編程語(yǔ)言和C語(yǔ)言基本沒(méi)有區(qū)別,所以CUDA很快就被全世界各個(gè)行業(yè)所接受。
在視頻領(lǐng)域,我們之前經(jīng)常都說(shuō)到了利用CUDA進(jìn)行視頻編碼,比如我們之前測(cè)試過(guò)的Cyberlink MediaShow,vReveal MotionDSP,ArcSoft TotalMedia Theatre以及MediaCoder等。但是視頻解碼一直由于GPU內(nèi)有專門的運(yùn)算模塊,導(dǎo)致這一領(lǐng)域幾乎無(wú)人問(wèn)津。而日前,CoreAVC推出了1.9.x版本的解碼器,正式加入了CUDA視頻解碼的功能。
CoreAVC官方網(wǎng)站上1.9.5版本的廣告已經(jīng)赫然出現(xiàn)了CUDA標(biāo)志
CoreAVC是非常流行的H.264解碼器之一,幾乎所有集多種解碼器于一身的播放器都帶有CoreAVC解碼器。今年2月份,CoreAVC率先發(fā)布了1.9.0版本的解碼器,首次支持CUDA解碼H.264視頻,不過(guò)由于當(dāng)時(shí)存在一些播放色塊的問(wèn)題,很快CoreAVC就推出了1.9.5版本的解碼器,從此H.264高清視頻解碼正式邁入CUDA時(shí)代。
我們知道,CUDA是一個(gè)完整的NVIDIA GPGPU解決方案,它直接提供了硬件的訪問(wèn)接口,而不必通過(guò)圖形API來(lái)實(shí)現(xiàn)GPU硬件的訪問(wèn)。也就是說(shuō),CUDA從某種意義上模擬了CPU的計(jì)算。而使用CUDA進(jìn)行高清視頻解碼的原理也就不難理解了!實(shí)際上,使用CUDA進(jìn)行高清視頻解碼,就是通過(guò)調(diào)用GPU中龐大的流處理器資源,進(jìn)行視頻解碼運(yùn)算,并不是調(diào)用GPU中專門的視頻處理單元。
視頻解碼的運(yùn)算量雖然不高,但是對(duì)處理器的并行處理效率有很高的要求,這就是為什么多核心CPU高清視頻解碼的效率比單核高很多的原因。而使用CUDA進(jìn)行解碼,GPU中有很多的流處理器資源可以調(diào)用,所以使用CUDA進(jìn)行視頻解碼運(yùn)算,簡(jiǎn)直是輕而易舉。而且由于運(yùn)算量不高,解碼計(jì)算基本不可能讓GPU全速工作,所以在功耗方面也能得到有效的控制。
另外,由于采用CUDA架構(gòu),GPU視頻解碼不再需要通過(guò)DXVA進(jìn)行硬件加速,所以可以徹底脫離DXVA的各種限制,從某種意義上模擬CPU進(jìn)行運(yùn)算,不僅可以獲得非常完美的兼容性,而且畫質(zhì)也和CPU軟解沒(méi)有什么區(qū)別,設(shè)置起來(lái)也更加方便。
MediaCoder也只有編碼過(guò)程采用CUDA技術(shù)
再來(lái)我們還可以談到CUDA視頻轉(zhuǎn)碼這件事情上,我們知道視頻的轉(zhuǎn)碼過(guò)程實(shí)際上就是解碼——編碼的過(guò)程,而之前部分即使采用CUDA進(jìn)行視頻轉(zhuǎn)碼,但解碼過(guò)程仍然是CPU來(lái)完成,只有編碼過(guò)程由CUDA來(lái)完成,這樣實(shí)際上還是沒(méi)有完全利用到GPU的優(yōu)勢(shì)。