徐圣凱, 潘 飛(南京理工大學(xué) 自動(dòng)化學(xué)院, 南京 210000)
軟硬結(jié)合解碼方式的4K視頻播放系統(tǒng)①
徐圣凱, 潘 飛
(南京理工大學(xué) 自動(dòng)化學(xué)院, 南京 210000)
針對(duì)4K視頻數(shù)據(jù)量很大, 傳統(tǒng)的CPU軟件解碼技術(shù)無(wú)法滿足性能要求. 設(shè)計(jì)了一種軟硬結(jié)合解碼方式的4K視頻播放系統(tǒng), 采用DirectShow和NVIDIA CUDA技術(shù)進(jìn)行GPU硬件解碼. 系統(tǒng)功能包括硬件系統(tǒng)信息獲取, 視頻源讀取, 視頻硬解碼和視頻顯示. 實(shí)驗(yàn)結(jié)果表明, 此播放系統(tǒng)在進(jìn)行4K視頻解碼播放時(shí), 既保障了視頻效果, 又極大降低了CPU使用率.
4K; 軟硬結(jié)合解碼; DirectShow; CUDA; CPU使用率
近些年來(lái), 多媒體技術(shù)得到了長(zhǎng)足的發(fā)展, 1080P全高清攝像頭, 4K電影, 4K超高清顯示屏等產(chǎn)品的問(wèn)世不斷地刷新著分辨率、幀率等參數(shù)極限[1], 為用戶提供了更完美的用戶體驗(yàn). 然而4K超高清視頻的信號(hào)容量是巨大的, 視頻信號(hào)經(jīng)過(guò)采集, 解碼后才能呈現(xiàn)在顯示屏上, 其中的解碼過(guò)程算法復(fù)雜, 對(duì)運(yùn)算處理能力要求很高. 傳統(tǒng)的軟件解碼技術(shù)依賴CPU的計(jì)算能力, 已經(jīng)無(wú)法滿足性能要求, 而嵌入式純硬件解碼不僅價(jià)格昂貴且架構(gòu)不靈活,無(wú)法大眾化推廣. 如何在保證視頻解碼效果的前提下, 降低成本、加快解碼速度、降低CPU使用率成為了研究熱點(diǎn).
純軟件解碼播放4K視頻時(shí)CPU使用率過(guò)高導(dǎo)致主機(jī)卡頓現(xiàn)象明顯, 很多高校和視頻處理公司開(kāi)始關(guān)注軟件框架與硬件解碼器相結(jié)合的播放體系, 利用GPU分擔(dān)部分視頻解碼工作. 當(dāng)前通過(guò)GPU解碼的技術(shù)主要有兩大類(lèi): 利用GPU內(nèi)部并行工作的流處理單元進(jìn)行硬件解碼, 編寫(xiě)在GPU上運(yùn)行的代碼, 例如ATI的Stream與NVIDI的CUDA, 第二種是間接通過(guò)GPU加速, 通過(guò)制定統(tǒng)一的解碼接口來(lái)實(shí)現(xiàn), 例如微軟的DXVA(DirectX Video Acceleration). 其中CUDA解碼方案中, 流處理器數(shù)量會(huì)對(duì)效率有一定的影響,不過(guò)這些主要在使用低端顯卡時(shí)才會(huì)出現(xiàn)差異, 而對(duì)于目前的入門(mén)級(jí)(9600GSO)以及中高端顯卡來(lái)說(shuō), 解碼時(shí)的差異并不明顯. DXVA解碼方案中, 雖然解碼器支持DXVA規(guī)范, 但不代表就能利用DXVA規(guī)范里面所有的功能組合, 它可以選擇自己有能力支持的, 或者想要支持的那些功能組合, 其他功能組合也許就放棄了. 還有, 某顯卡雖然表示支持某種能力, 但如果解碼器認(rèn)為這個(gè)能力的支持不夠穩(wěn)定, 容易導(dǎo)致系統(tǒng)崩潰或錯(cuò)誤, 或者性能低下, 它也可以放棄這種能力.大量研究表明DXVA解碼方案的CPU使用率要比CUDA解碼稍低一些, 但利用CUDA解碼極大地釋放CPU壓力的同時(shí), 不像DXVA解碼方案那樣存在各種兼容性問(wèn)題, 而且功耗也比CPU軟解方案要關(guān)低不少,可以說(shuō)CUDA解碼是一個(gè)折中的解碼方案. 基于這些技術(shù), 臺(tái)灣訊連科技公司的知名商業(yè)軟件PowerDVD和騰訊公司的QQ影音播放器開(kāi)始支持CUDA硬件解碼, 不過(guò)PowerDVD是一款收費(fèi)軟件, QQ影音播放器進(jìn)行硬件解碼時(shí)配置復(fù)雜, 且解碼器進(jìn)行了產(chǎn)權(quán)保護(hù)[2-9].
本文軟硬結(jié)合解碼方式的4K視頻播放系統(tǒng)采用CUDA解碼方式, 依靠靈活的軟件框架, 實(shí)現(xiàn)軟解碼與CUDA硬解碼自動(dòng)設(shè)置機(jī)制, 對(duì)于支持CUDA解碼的硬件設(shè)備自動(dòng)啟動(dòng)CUDA硬解碼, 不需要繁瑣的手動(dòng)設(shè)置. 自開(kāi)發(fā)的CUDA解碼器獨(dú)立封裝, 全程碼流追蹤透明高效, 也為后續(xù)深度開(kāi)發(fā)提供了支持. 實(shí)驗(yàn)表明該系統(tǒng)播放4K視頻, 自啟動(dòng)硬解碼時(shí), CPU使用率巨幅下降, 保證了系統(tǒng)操作的流暢性.
4K指的是分辨率, 于2007年提出, 2012年規(guī)范,因其橫向解析度約為4000像素而得名, 包括4096*2160、3840*2160等多種分辨率規(guī)格. 從分辨率參數(shù)來(lái)看, 4K約達(dá)到了全高清視頻(1080P)的4倍, 如圖1所示.

圖1 4K分辨率示意圖
本文設(shè)計(jì)的軟硬結(jié)合解碼方式的4K視頻播放系統(tǒng), 主要實(shí)現(xiàn)的功能有本地文件的讀取, 4K視頻的H.264硬件解碼和視頻顯示. 4K視頻播放系統(tǒng)結(jié)構(gòu)如圖2, 系統(tǒng)分為硬件系統(tǒng)信息獲取模塊, 4K視頻源讀取模塊, 硬解碼Filter模塊, 模塊間連接與顯示模塊.硬件系統(tǒng)信息獲取模塊根據(jù)硬件情況選擇解碼器類(lèi)型,對(duì)支持CUDA解碼的系統(tǒng)提供無(wú)感知的硬件解碼功能,系統(tǒng)軟解碼器采用第三方解碼器.

圖2 4K視頻播放系統(tǒng)結(jié)構(gòu)
2.1 視頻源讀取模塊
DirectShow提供了大量的Filter用以支持基本的應(yīng)用. 如圖3所示是4K視頻文件播放的部分鏈路. 其中, 箭頭方向即是數(shù)據(jù)的流向, Filter Source(Async)屬于Source Filter, 它用于管理硬盤(pán)上指定的播放文件,并根據(jù)Splitter的要求提供數(shù)據(jù), Splitter負(fù)責(zé)向Filter Source(Async)索取數(shù)據(jù), 并將取得數(shù)據(jù)的音頻和視頻進(jìn)行分離, 然后分別從各自的輸出Pin輸出給音頻解碼器和視頻解碼器, 此Source Filter硬盤(pán)讀取速度滿足要求, 可以直接用作系統(tǒng)的視頻源讀取模塊.

圖3 4K視頻文件播放的部分鏈路
2.2 硬解碼器模塊設(shè)計(jì)與實(shí)現(xiàn)
CUDA是一種由NVIDIA推出的通用并行計(jì)算架構(gòu), 該架構(gòu)使GPU能夠解決復(fù)雜的計(jì)算問(wèn)題. 它包含了CUDA指令集架構(gòu)(ISA)以及GPU內(nèi)部的并行計(jì)算引擎. 開(kāi)發(fā)人員可以使用C語(yǔ)言來(lái)為CUDA?架構(gòu)編寫(xiě)程序, 所編寫(xiě)出的程序可以在支持CUDA?的處理器上以超高性能運(yùn)行. NVIDIA在CUDA的基礎(chǔ)上建立了一套SDK用于使用顯卡硬件加速來(lái)進(jìn)行H.264編碼, 可以在CPU占用率很小的情況下完成高質(zhì)量實(shí)時(shí)的H264編碼. 系統(tǒng)需要硬件顯卡驅(qū)動(dòng)支持CUDA.
系統(tǒng)硬解碼Filer功能設(shè)計(jì)為: 接收H.264視頻流輸入, 解碼后輸出RGB24或者YUY2格式的圖像幀序列, 一個(gè)輸入Pin一個(gè)輸出Pin, 類(lèi)型為T(mén)ransform Filter, 采用CSource作為Filter的父類(lèi), 因?yàn)镃Source的輸出Pin(從CSourceStream類(lèi)派生)實(shí)現(xiàn)了一個(gè)數(shù)據(jù)線程, 在這個(gè)線程中, 可以控制整個(gè)解碼過(guò)程. 設(shè)計(jì)一個(gè)比較大的緩沖管理H.264流數(shù)據(jù), 當(dāng)輸入Pin有Sample輸人時(shí), 直接把數(shù)據(jù)放入緩沖等待解碼線程讀;解碼線程也可以主動(dòng)訪問(wèn)該緩沖, 并從中取出足夠數(shù)據(jù)以完成圖像幀的解碼.
硬解碼器Filter的實(shí)現(xiàn): Filter類(lèi)名為CudaDecode,輸入Pin類(lèi)名為CudaInputPin, 輸出Pin類(lèi)名為DecodeStream, 它們的類(lèi)繼承關(guān)系如圖4.

圖5 系統(tǒng)解碼
實(shí)現(xiàn)硬件解碼器核心部分是實(shí)現(xiàn)CUDA解碼, 首先我們配置nvcuvid.dll 和 cutil32.dll動(dòng)態(tài)鏈接庫(kù), 系統(tǒng)解碼過(guò)程如圖5, 主要函數(shù)有:
(1) InitCuda(CUvideoctxlock *pLock). pLock參數(shù)為關(guān)鍵段類(lèi)似于CrticalSection, 函數(shù)的主要功能是初始化顯卡并創(chuàng)建一個(gè)顯卡設(shè)備.
(2)HandleVideoSequence(void *pvUserData, CUVIDEOFORMAT *pFormat). 函數(shù)的功能是創(chuàng)建初始化H.264流分析器.
(3)HandlePictureDecode(void *pvUserData, CUVIDPICPARAMS *pPicParams). 函數(shù)功能是解碼每幀視頻數(shù)據(jù).
(4)HandlePictureDisplay(void *pvUserData, CUVIDPARSERDISPINFO *pPicParams). 函數(shù)用來(lái)轉(zhuǎn)換, 處理顯示轉(zhuǎn)碼后的數(shù)據(jù).
2.3 連接與顯示模塊
本文4K視頻播放系統(tǒng)的硬件結(jié)構(gòu)是電腦主機(jī)通過(guò)高清晰度多媒體接口(英文: High Definition Multimedia Interface, HDMI)與4K顯示屏連接, 軟件結(jié)構(gòu)方面: 各個(gè)功能模塊作為獨(dú)立的Filter注冊(cè)在windows系統(tǒng)中, 功能模塊的連接即為Filter上Pin的連接. 連接的方向是由上一級(jí)Filter(Upstream Filter)的輸出Pin指向下一級(jí)(Downstream Filter)的輸入Pin. Pin是一種COM組件, 而且每個(gè)Pin上都實(shí)現(xiàn)了IPin接口, Pin正是通過(guò)這個(gè)IPin接口來(lái)完成連接的, 一般調(diào)用接口方法IFilterGraph::ConnectDirect來(lái)實(shí)現(xiàn). 本文Renderer Filter的功能是是接收硬解碼Filter解碼后的數(shù)據(jù), 然后在4K顯示器上顯示. Renderer Filter的實(shí)現(xiàn): Filter類(lèi)名為CVideoRender, Pin的類(lèi)名為CVideoInputPin, 屬性頁(yè)類(lèi)名為CQualityProperties. 關(guān)鍵類(lèi)CVideoRender類(lèi)中定義的一些成員變量有:
CImageAllocator m_ImageAllocator; //Sample管理器
CVideoInputPin m_InputPin; // 輸入Pin
CImageDisplay m_Display; // 管理圖像顯示格式
CMediaType m_mtIn; // 連接用的媒體類(lèi)型
CVideoText m_VideoText; //視頻窗口
CImagePalette m_ImagePalette; // 管理調(diào)色板
CDrawImage m_DrawImage; // 畫(huà)圖工作
SIZE m_VideoSize; // 當(dāng)前視頻圖像大小定義上述成員使用了一系列的工具類(lèi), 它們的繼承關(guān)系如圖:
Filter需要重寫(xiě)CheckMediaType,CompleteConnect等一系列函數(shù), 并完成進(jìn)度條, 屬性頁(yè)的功能, 最終注冊(cè)后供系統(tǒng)使用.

圖6 繼承關(guān)系
硬件環(huán)境: CPU為Intel(R)Core(TM)i5-5200U , 主頻為2.2GHz, GPU為GeForce 940M. 軟件環(huán)境: Windows 7 、vs2010 、DirectShow開(kāi)發(fā)環(huán)境. 本文主要測(cè)試CPU使用率這個(gè)指標(biāo). 測(cè)試時(shí)播放4K視頻文件(時(shí)長(zhǎng)4分3秒, 內(nèi)存占614M, 壓縮格式為h264,封裝格式為MP4)的前20秒內(nèi)容, 使用Process Explorer檢測(cè)CPU使用率. 當(dāng)使用純軟件解碼器系統(tǒng)播放4K視頻時(shí)CPU使用率如圖7, 利用本文系統(tǒng)播放4K視頻時(shí)CPU使用率如圖8.
圖7與圖8比較可以看出, 播放4k視頻, 在保證畫(huà)面清晰流暢的前提下, 本文硬解碼播放系統(tǒng)CPU使用率只有20%左右, 而純軟件解碼系統(tǒng)CPU使用率達(dá)到了80%左右.

圖7 純軟件解碼器系統(tǒng)播放4K視頻時(shí)CPU使用率
本文基于DirectShow與CUDA技術(shù), 開(kāi)發(fā)了4K視頻播放系統(tǒng), 實(shí)現(xiàn)了4K視頻硬解碼. 采用了軟硬件結(jié)合的方式, 兼顧軟件解碼的靈活和硬件解碼的速度,大大降低了計(jì)算機(jī)CPU的使用率, 在實(shí)際應(yīng)用中有很大的價(jià)值.

圖8 CUDA硬解碼播放4K視頻文件時(shí)CPU使用率
1 武鳳翔.基于DirectShow和WPF的實(shí)時(shí)視頻圖像采集與處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).計(jì)算機(jī)應(yīng)用與軟件,2015,(3):331–333.
2 伍開(kāi)勝,羅宇,劉斌.基于directshow的視頻播放器設(shè)計(jì)與實(shí)現(xiàn).科技視界,2015,(31):184–185.
3 朱偉.基于CUDA的H.264視頻解碼[碩士學(xué)位論文].長(zhǎng)沙:湖南師范大學(xué),2011.
4 尚青青.多場(chǎng)所多路高清視頻監(jiān)控中心的設(shè)計(jì)與實(shí)現(xiàn)[碩士學(xué)位論文].南京:南京郵電大學(xué),2013.
5 李虎.H.264解碼器并行算法設(shè)計(jì)與基于CUDA的實(shí)現(xiàn)[碩士學(xué)位論文].大連:大連理工大學(xué),2014.
6 劉旭鳳.基于4K2K電視構(gòu)架的視頻解碼顯示研究[碩士學(xué)位論文].濟(jì)南:山東大學(xué),2013.
7 章劍.基于CUDA平臺(tái)的H.264視頻編碼器研究設(shè)計(jì)[碩士學(xué)位論文].南京:南京航空航天大學(xué),2012.
8 金曙陽(yáng).基于GPU并行編碼的全高清互動(dòng)教學(xué)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[碩士學(xué)位論文].南京:南京郵電大學(xué),2014.
9 Adeyemi-Ejeye AO, Walker S, Fleury M. 4kUHD H264 wireless live video streaming using CUDA. Journal of Electrical and Computer Engineering, 2014.
4K Video Playback System Based on Hard and Soft Decoding Mode
XU Sheng-Kai, PAN Fei
(School of Automatization, Nanjing University of Science and Technology, Nanjing 210000, China)
Due to the amount of 4K video data is large, and the traditional CPU software decoder technology cannot meet the performance requirement. The 4K video playback system based on combination of hard and soft decoding mode is designed, which uses DirectShow and CUDA hardware decoding technology. And the system includes functions of hardware system information acquisition, video source reader, video hard decoding, and video display. Experimental results show that this system can achieve good effect and greatly reduce the CPU occupancy rate when playing 4K video. Key words: 4K; hard and soft decoding; DirectShow; CUDA; CPU occupancy rate
2016-07-09;收到修改稿時(shí)間:2016-08-08
10.15888/j.cnki.csa.005669