一種基于gpu的完全硬件轉(zhuǎn)碼的方法和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本專利涉及到流媒體視頻轉(zhuǎn)碼技術(shù),尤其是針對一種基于GPU的對具有H.264、MPEG-2編碼格式的視頻數(shù)據(jù)進(jìn)行完全硬件轉(zhuǎn)碼生成H.264編碼格式的視頻以減少CPU占用率的方法和系統(tǒng)。
【背景技術(shù)】
[0002]2007 年,NVIDIA 公司推出了 CUDA (Compute Unified Device Architecture)框架以及CUDA C語言,將傳統(tǒng)的GPU通用計算(GPGPU)推向一個新的高峰。傳統(tǒng)的GPU通用計算是通過“欺騙”GPU與顯存的渲染過程,來借助顯卡的強(qiáng)大并行處理矩陣型數(shù)據(jù)的能力達(dá)到通用計算的目的。這一過程既不直觀,也很費力,很難得到較好的推廣。而CUDA框架的出現(xiàn),使GPGPU編程變得類似普通高級語言編程,使開發(fā)者可以便利使用GPU的強(qiáng)大并行運(yùn)算能力。具體而言,CUDA框架是一個新的基礎(chǔ)架構(gòu),這個架構(gòu)可以使用GPU來解決商業(yè)、工業(yè)以及科學(xué)方面的復(fù)雜計算問題。它是一個完整的GPGPU解決方案,提供了硬件的直接訪問接口,而不必像傳統(tǒng)方式一樣必須依賴圖形API接口來實現(xiàn)GPU的訪問。在架構(gòu)上采用了一種全新的計算體系結(jié)構(gòu)來使用GPU提供的硬件資源,從而給大規(guī)模的數(shù)據(jù)計算應(yīng)用提供了一種比CPU更加強(qiáng)大的計算能力。CUDA C采用C語言作為編程語言提供大量的高性能計算指令開發(fā)能力,使開發(fā)者能夠在GPU的強(qiáng)大計算能力的基礎(chǔ)上建立起一種效率更高的密集數(shù)據(jù)計算解決方案。
[0003]GPU極為擅長處理大型矩陣型或類矩陣型數(shù)據(jù)的整體變換或計算,在當(dāng)時,借助GPU的計算能力可以達(dá)到CPU效率的數(shù)倍甚至數(shù)十倍。盡管在現(xiàn)在隨著CPU的進(jìn)一步發(fā)展,GPU的壓倒性優(yōu)勢有所衰減,但其強(qiáng)大依然不容小視。
[0004]而視頻轉(zhuǎn)碼技術(shù)是指將已經(jīng)壓縮編碼的視頻碼流轉(zhuǎn)換成另一個視頻碼流,以適應(yīng)不同的網(wǎng)絡(luò)帶寬、不同的終端處理能力和不同的用戶需求。隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,越來越多的視頻被廣泛傳播到各種播放設(shè)備上,例如個人計算機(jī)、筆記本、電視機(jī)、MP4播放器、平板和手機(jī)等等。這些設(shè)備通常安裝了各種不同的操作系統(tǒng)或播放軟硬件,分別支持不同格式的視頻流。這就很容易導(dǎo)致用戶所獲得的視頻的格式可能并不能直接被其持有的播放設(shè)備所支持。而隨著技術(shù)的進(jìn)步,各種新的視頻編碼技術(shù)被不斷推出,這也導(dǎo)致老的設(shè)備可能并不支持最新的視頻格式。因此,為了解決上述問題,視頻轉(zhuǎn)碼技術(shù)正變得日益重要。所述視頻轉(zhuǎn)碼技術(shù)本質(zhì)上是一個先對原始格式的視頻進(jìn)行解碼,隨后將其轉(zhuǎn)碼成所需的格式,再以新的視頻編碼標(biāo)準(zhǔn)對其進(jìn)行編碼的過程。對于高效的視頻文件轉(zhuǎn)碼需求,視頻文件的每一幀都是一幅圖像,而圖像是完美的矩陣型數(shù)據(jù),因此,借助GPGPU進(jìn)行GPU硬件視頻轉(zhuǎn)碼,從而在效率上超越傳統(tǒng)的純CPU視頻轉(zhuǎn)碼就成了一個很自然的思路。
[0005]NVIDIA伴隨著CUDA,也發(fā)布了視頻的解碼與編碼工具開發(fā)包,解碼工具為NVCUVID (簡稱CUVID),編碼工具為NVENC。乍看之下,CUVID+NVENC已經(jīng)可以完成GPU視頻轉(zhuǎn)碼,而且新版本的FFMPEG中已經(jīng)增加了對NVENC的支持,但經(jīng)代碼分析和運(yùn)行測試,可以發(fā)現(xiàn):NVENC包含轉(zhuǎn)碼計算(包含轉(zhuǎn)碼率計算)和編碼器兩個部分,其中轉(zhuǎn)碼部分的計算依舊在CPU里完成,并非真正的純GPU硬件轉(zhuǎn)碼——FFMPEG也是如此。另一個常見的商業(yè)轉(zhuǎn)碼軟件WOWZA也不是純GPU硬件轉(zhuǎn)碼,它們都采用了 “GPU解碼,取回內(nèi)存,CPU轉(zhuǎn)碼,推送顯存,GPU編碼”的方式,這一方式對CPU和內(nèi)存資源消耗依舊很大,同時,在轉(zhuǎn)碼過程中,數(shù)據(jù)在內(nèi)存和顯存之間的來回過程消耗了大量的系統(tǒng)時間,而且轉(zhuǎn)碼計算并沒有充分利用GPU的計算能力。因此,現(xiàn)有的NVENC和應(yīng)用NVENC的諸如FFMPEG、W0WZA之類的轉(zhuǎn)碼軟件均不是嚴(yán)格意義上的完全基于GPU的硬件轉(zhuǎn)碼。
[0006]因此,為了提高視頻轉(zhuǎn)碼效率,存在期望能夠提供一種基于GPU的完全硬件轉(zhuǎn)碼的方法和系統(tǒng)的需求。
【發(fā)明內(nèi)容】
[0007]本申請的方法和系統(tǒng)是在原本NVENC的基礎(chǔ)上,借助OPENCV封裝的CUVID進(jìn)行硬件解碼,然后在顯存里使用新開發(fā)的轉(zhuǎn)碼邏輯進(jìn)行轉(zhuǎn)碼計算,最后使用NVENC的編碼器進(jìn)行編碼,從而完成完整的純GPU硬件轉(zhuǎn)碼過程。
[0008]在本申請的一個方面,提供了一種基于GPU的完全硬件轉(zhuǎn)碼的方法,其特征在于,包括:GPU轉(zhuǎn)碼器從顯存中讀取經(jīng)GPU解碼器解碼的YUV4:4:4格式的視頻幀數(shù)據(jù);將所述視頻幀數(shù)據(jù)拆分成Y、U、V三個通道的獨立矩陣;對于Y矩陣,通過轉(zhuǎn)換分辨率形成新Y矩陣;對于U矩陣和V矩陣,按YUV4:2:0格式轉(zhuǎn)換分辨率分別形成新U矩陣和新V矩陣,并且將所述新U矩陣和新V矩陣合并成雙通道的UV矩陣;將所述新Y矩陣的數(shù)據(jù)和所述雙通道的UV矩陣的數(shù)據(jù)分別復(fù)制到待編碼的顯存中;以及GPU編碼器對從所述待編碼的顯存中讀取的所述新Y矩陣的數(shù)據(jù)和所述雙通道的UV矩陣的數(shù)據(jù)進(jìn)行編碼以生成輸出的視頻文件。
[0009]在本發(fā)明的另一個方面,提供了一種基于GPU的完全硬件轉(zhuǎn)碼的系統(tǒng),其特征在于,包括:GPU解碼器,配置為將來自存儲器或數(shù)據(jù)源的視頻幀數(shù)據(jù)解碼成YUV4:4:4格式的視頻幀數(shù)據(jù)并將其寫入到顯存中;GPU轉(zhuǎn)碼器,配置用于執(zhí)行下述操作:從所述顯存中讀取經(jīng)所述GPU解碼器解碼的YUV4:4:4格式的視頻幀數(shù)據(jù);將所述視頻幀數(shù)據(jù)拆分成Y、U、V三個通道的獨立矩陣;對于Y矩陣,通過轉(zhuǎn)換分辨率形成新Y矩陣;對于U矩陣和V矩陣,按YUV4:2:0格式轉(zhuǎn)換分辨率分別形成新U矩陣和新V矩陣,并且將所述新U矩陣和新V矩陣合并成雙通道的UV矩陣;將所述新Y矩陣的數(shù)據(jù)和所述雙通道的UV矩陣的數(shù)據(jù)分別復(fù)制到待編碼的顯存中;以及GPU編碼器,配置為對從所述待編碼的顯存中讀取的所述新Y矩陣的數(shù)據(jù)和所述雙通道的UV矩陣的數(shù)據(jù)進(jìn)行編碼以生成輸出的視頻文件。
[0010]一個或多個實施例的詳情在附圖及以下描述中闡述。通過閱讀以下詳細(xì)描述并查閱相關(guān)聯(lián)的附圖,其它特征和優(yōu)點將是顯而易見的。應(yīng)該理解,下述詳細(xì)的描述僅是說明性的,而不是對所要求保護(hù)的發(fā)明的限制。
【附圖說明】
[0011]為讓本申請的上述目的、特征和優(yōu)點能更明顯易懂,以下結(jié)合附圖對本申請的【具體實施方式】作詳細(xì)說明,其中:
[0012]圖1是根據(jù)本申請的實施例的系統(tǒng)硬件結(jié)構(gòu)示意圖。
[0013]圖2是根據(jù)本申請的實施例的GPU轉(zhuǎn)碼器工作流程圖的理論層面示意圖。
[0014]圖3是根據(jù)本申請的實施例的GPU轉(zhuǎn)碼器工作流程圖的實踐層面示意圖。
【具體實施方式】
[0015]在現(xiàn)有GPU轉(zhuǎn)碼技術(shù)中的“解碼-轉(zhuǎn)碼-編碼”計算鏈中,轉(zhuǎn)碼步驟的實現(xiàn)依舊是在GPU對視頻幀數(shù)據(jù)解碼之后將所解碼的視頻幀數(shù)據(jù)從顯存取回到內(nèi)存中,然后使用CPU完成轉(zhuǎn)碼計算后,再從內(nèi)存將所述轉(zhuǎn)碼后的數(shù)據(jù)推送至顯存,再由GPU進(jìn)行后續(xù)的編碼操作。這一轉(zhuǎn)碼過程中,數(shù)據(jù)在顯存與內(nèi)存之間多了一個來回傳輸?shù)倪^程,耗費了大量的系統(tǒng)時間,同時也無法徹底降低視頻轉(zhuǎn)碼處理的CPU占用率,也沒有充分利用GPU的計算能力。
[0016]因此,本申請的方法和系統(tǒng)的目的即是設(shè)法讓“解碼-轉(zhuǎn)碼-編碼”這三個核心步驟全部在GPU及顯存里完成,省去轉(zhuǎn)碼步驟在顯存與內(nèi)存之間的數(shù)據(jù)傳輸?shù)南到y(tǒng)耗時,并通過極大化使用GPU的計算能力來相應(yīng)地降低CPU占用率,使得所述視頻轉(zhuǎn)碼處理的整個過程都可以不依賴于CPU的使用,實現(xiàn)真正意義上的完全硬件轉(zhuǎn)碼。
[0017]具體而言,在現(xiàn)有的開源庫OPENCV中,封裝了一定程度的GPU、圖像、視頻處理的類與函數(shù),但這些遠(yuǎn)不足以直接完成GPU轉(zhuǎn)碼,特別是對于H.264編碼需要的YUV4:2:0格式,現(xiàn)有的OPENCV中的GPU模塊沒有提供直接支持。針對現(xiàn)有的OPENCV中的所述缺陷,本申請?zhí)峁┝藙?chuàng)新的GPU轉(zhuǎn)碼邏輯來執(zhí)行傳統(tǒng)的在CPU中進(jìn)行的轉(zhuǎn)碼計算。當(dāng)然,對于邏輯實現(xiàn)過程中可用OPENCV函數(shù)和NVENC原有結(jié)構(gòu)實現(xiàn)的步驟,本申請則還是調(diào)用了相應(yīng)的原有函數(shù)。
[0018]在本申請的方案中,通過利用創(chuàng)新的GPU轉(zhuǎn)碼邏輯來使得GPU支持YUV4:2:0格式以實現(xiàn)GPU對YUV4:2:0格式的轉(zhuǎn)碼計算,使視頻幀數(shù)據(jù)不需要再在GPU解碼后從顯存取回內(nèi)存以供CPU轉(zhuǎn)碼計算,而是可以繼續(xù)留在顯存中直接經(jīng)由GPU進(jìn)行轉(zhuǎn)碼計算,并因此也取消了原本在CPU轉(zhuǎn)碼計算后將幀數(shù)據(jù)從內(nèi)存再推回顯存的步驟,而是直接將顯存中轉(zhuǎn)碼好的數(shù)據(jù)送至GPU編碼工具進(jìn)行編碼,即可完成完整的GPU轉(zhuǎn)碼流程。
[0019]經(jīng)實測,本申請的方法的轉(zhuǎn)碼速度比純CPU轉(zhuǎn)碼方法提升了 3到5倍,比現(xiàn)在正在使用的CPU+GPU的轉(zhuǎn)碼方案快1.5到3倍。同時,使得CPU占用率也大大下降,實現(xiàn)了系統(tǒng)時間的節(jié)省,CPU占用率的下降和整體轉(zhuǎn)碼效率的提高等改進(jìn)。
[0020]現(xiàn)在就開始討論本申請的具體方案。在本申請中將整個轉(zhuǎn)碼系統(tǒng)和方法及其所必須的前導(dǎo)與后續(xù)步驟,即完整的對具有H.264、MPEG-2編碼格式的視頻轉(zhuǎn)碼過程,將其實現(xiàn)為一個系統(tǒng)工程,稱為WSNVENC。其中,所述MPEG-2、H.264編碼格式可被目前的GPU解碼器支持并且解碼后生成YUV4:4:4格式,但所述示例的編碼格式并非限制性的,實際上,本申請的WSNVENC所支持的格式取決于GPU自身支持的視頻格式。所述WSNVENC的核心貢獻(xiàn)如圖3所示在解碼-轉(zhuǎn)碼-編碼的計