本發(fā)明涉及H264格式的視頻流的解碼領(lǐng)域,具體涉及一種基于DXVA(DirectX Video Acceleration,視頻硬件加速)進(jìn)行硬件解碼H264(數(shù)字視頻壓縮格式)視頻流的方法及系統(tǒng)。
背景技術(shù):
隨著網(wǎng)絡(luò)的發(fā)展,越來越多的用戶喜愛在網(wǎng)絡(luò)直播平臺(tái)中觀看直播,因此網(wǎng)絡(luò)直播平臺(tái)已經(jīng)廣泛適用于社會(huì)之中,網(wǎng)絡(luò)直播平臺(tái)的直播內(nèi)容也越來越多樣化。
為了保證網(wǎng)絡(luò)信息的健康傳播,杜絕不良直播內(nèi)容的流出,需要網(wǎng)絡(luò)直播平臺(tái)的直播內(nèi)容進(jìn)行監(jiān)控,在監(jiān)控之前需要對(duì)直播內(nèi)容進(jìn)行解碼?,F(xiàn)有的對(duì)網(wǎng)絡(luò)直播平臺(tái)的直播內(nèi)容一般通過H264進(jìn)行編碼,H264格式的視頻流進(jìn)行解碼的方法一般為軟件解碼,軟件解碼方法存在以下缺陷:
傳統(tǒng)的H264軟件解碼時(shí),會(huì)占用較多的CPU資源,進(jìn)而使得解碼速度較慢,同時(shí)進(jìn)行解碼的視頻流較少;而且隨著視頻顯示格式的提高,網(wǎng)絡(luò)直播平臺(tái)中的視頻流的視頻顯示格式越來越高清化,采用H264軟件對(duì)HD視頻流(高清視頻流,分辨率達(dá)到720p以上的視頻流)的解碼更為緩慢。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明解決的技術(shù)問題為:提供一種基于DXVA進(jìn)行硬件解碼H264視頻流的方法及系統(tǒng)。本發(fā)明對(duì)高清視頻流的解碼速度較快,工作效率較高。
為達(dá)到以上目的,本發(fā)明提供的基于DXVA進(jìn)行硬件解碼H264視頻流的方法,包括以下步驟:
S1:通過多媒體編程接口創(chuàng)建DXVA功能接入接口;
S2:通過DXVA功能接入接口創(chuàng)建視頻解碼服務(wù)接口;
S3:通過視頻解碼服務(wù)接口獲取DXVA硬件解碼器中所有的硬件解碼級(jí)別,分別獲取每個(gè)解碼級(jí)別的最優(yōu)硬件解碼參數(shù);
S4:調(diào)用視頻解碼服務(wù)接口分別創(chuàng)建解碼視頻輸出接口和硬件解碼接口;
S5:將FFMPEG分別與S3中的最優(yōu)硬件解碼參數(shù)、S4中的解碼視頻輸出接口和硬件解碼接口關(guān)聯(lián);
S6:通過關(guān)聯(lián)后的FFMPEG對(duì)需要解碼的視頻流進(jìn)行解碼并顯示。
本發(fā)明提供的實(shí)現(xiàn)上述方法的基于DXVA進(jìn)行硬件解碼H264視頻流的系統(tǒng),包括DXVA功能接入接口創(chuàng)建模塊、視頻解碼服務(wù)接口創(chuàng)建模塊、最優(yōu)硬件解碼參數(shù)獲取模塊、解碼視頻輸出接口創(chuàng)建模塊、硬件解碼接口創(chuàng)建模塊、FFMPEG關(guān)聯(lián)模塊和解碼顯示模塊;
DXVA功能接入接口創(chuàng)建模塊用于:通過多媒體編程接口創(chuàng)建DXVA功能接入接口;
視頻解碼服務(wù)接口創(chuàng)建模塊用于:通過DXVA功能接入接口創(chuàng)建視頻解碼服務(wù)接口;
最優(yōu)硬件解碼參數(shù)獲取模塊用于:通過視頻解碼服務(wù)接口獲取DXVA硬件解碼器中所有的硬件解碼級(jí)別,分別獲取每個(gè)解碼級(jí)別的最優(yōu)硬件解碼參數(shù);
解碼視頻輸出接口創(chuàng)建模塊用于:調(diào)用視頻解碼服務(wù)接口創(chuàng)建解碼視頻輸出接口;
硬件解碼接口創(chuàng)建模塊用于:調(diào)用視頻解碼服務(wù)接口創(chuàng)建硬件解碼接口;
FFMPEG關(guān)聯(lián)模塊用于:將FFMPEG分別與最優(yōu)硬件解碼參數(shù)、解碼視頻輸出接口和硬件解碼接口關(guān)聯(lián);
解碼顯示模塊用于:通過FFMPEG對(duì)需要解碼的視頻流進(jìn)行解碼并顯示。
與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)在于:
與現(xiàn)有技術(shù)中的軟件解碼相比,本發(fā)明將DXVA硬件解碼器與FFMPEG(Fast Forward Mpeg,多媒體視頻處理工具)結(jié)合,從而基于DXVA對(duì)網(wǎng)絡(luò)直播平臺(tái)的視頻流進(jìn)行硬件解碼。經(jīng)測(cè)試得出,本發(fā)明的方法和系統(tǒng)使用時(shí),利用Windows操作系統(tǒng)的視頻加速接口,在Intel的I5-4440這樣的計(jì)算機(jī)下,能夠同時(shí)進(jìn)行50多路的1080p高清視頻流的硬件解碼,解碼速度較快,工作效率較高,進(jìn)而能夠?qū)崿F(xiàn)通過多臺(tái)計(jì)算機(jī)的配置,對(duì)網(wǎng)絡(luò)直播平臺(tái)下的所有視頻直播內(nèi)容進(jìn)行監(jiān)控。
附圖說明
圖1為本發(fā)明實(shí)施例中的基于DXVA進(jìn)行硬件解碼H264視頻流的方法的流程圖。
具體實(shí)施方式
以下結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)說明。
參見圖1所示,本發(fā)明實(shí)施例中的基于DXVA進(jìn)行硬件解碼H264視頻流的方法,包括以下步驟:
S1:通過多媒體編程接口創(chuàng)建DXVA功能接入接口并進(jìn)行初始化;多媒體編程接口采用Direct3D9(DirectX的一個(gè)版本,其包含2D或3D圖像的編程接口、音頻接口、以及外接設(shè)備的輸入輸出接口);在此基礎(chǔ)上,S1的具體流程為:
S101:通過DXVA2CreateDirect3DDeviceManager9(接入接口創(chuàng)建函數(shù))創(chuàng)建IDirect3DDeviceManager9接口(即DXVA功能接入接口)。
S102:通過IDirect3D9接口(Direct3D9的入口接口)的創(chuàng)建函數(shù)(CreateDevice)創(chuàng)建解碼圖像顯示接口:IDirect3DDevice9接口,該接口是Direct3D9中最為重要的一個(gè)接口,提供創(chuàng)建資源、狀態(tài)管理、內(nèi)存管理和顯示繪制等功能。
S103:通過IDirect3DDevice9接口對(duì)IDirect3DDeviceManager9接口進(jìn)行初始化。
S2:通過DXVA功能接入接口創(chuàng)建視頻解碼服務(wù)接口,具體流程為:
S201:調(diào)用IDirect3DDeviceManager9接口的重置函數(shù)(ResetDevice),對(duì)IDirect3DDeviceManager9接口進(jìn)行重置;
S202:調(diào)用IDirect3DDeviceManager9接口的設(shè)備句柄獲取函數(shù)(OpenDeviceHandle),獲取一個(gè)設(shè)備句柄deviceHandle;
S203:調(diào)用IDirect3DDeviceManager9接口的視頻服務(wù)獲取函數(shù)(GetVideoService),通過S202中的設(shè)備句柄deviceHandle創(chuàng)建IDirectXVideoDecoderService接口(視頻解碼服務(wù)接口)。
S3:通過視頻解碼服務(wù)接口獲取DXVA硬件解碼器中所有的硬件解碼級(jí)別,分別獲取每個(gè)解碼級(jí)別的最優(yōu)硬件解碼參數(shù),具體流程為:
S301:調(diào)用IDirectXVideoDecoderService接口的硬件解碼級(jí)別獲取函數(shù)(GetDecoderDeviceGuids),獲取DXVA硬件解碼器中所有的硬件解碼級(jí)別。
S302:調(diào)用硬件解碼參數(shù)獲取函數(shù)(GetDecoderConfigurations),獲取每個(gè)解碼級(jí)別的DXVA2_ConfigPictureDecode(最優(yōu)硬件解碼參數(shù)),以供后面的過程使用。
S4:調(diào)用視頻解碼服務(wù)接口的表面創(chuàng)建函數(shù)(CreateSurface),創(chuàng)建解碼視頻輸出接口(IDirect3DSurface9接口),解碼后的視頻圖像內(nèi)容存儲(chǔ)在該接口中。調(diào)用視頻解碼服務(wù)接口的視頻解碼創(chuàng)建函數(shù)(CreateVideoDecoder)創(chuàng)建硬件解碼接口(IDirectXVideoDecoder接口)并初始化。
S5:將FFMPEG分別與S3中的最優(yōu)硬件解碼參數(shù)、S4中的解碼視頻輸出接口和硬件解碼接口關(guān)聯(lián),具體流程為:
S501:對(duì)FFMPEG進(jìn)行初始化,與DXVA關(guān)聯(lián)形成DXVA連接場(chǎng)景(dxva_context)。
S502:分別將S3中的硬件解碼參數(shù)DXVA2_ConfigPictureDecode以及S4中的解碼視頻輸出接口IDirect3DSurface9和硬件解碼接口IDirectXVideoDecoder,賦值至dxva_context中的對(duì)應(yīng)字段。
S503:將賦值后的dxva_context與FFMPEG的結(jié)構(gòu)體數(shù)據(jù)(AVCodecContext)的硬件解碼連接參數(shù)(hwaccel_context)關(guān)聯(lián),從而建立起DXVA同F(xiàn)FMPEG的連接。
S503中的AVCodecContext是FFMPEG的解碼函數(shù)的重要解碼條件,默認(rèn)情況下,解碼函數(shù)是進(jìn)行軟件解碼的;所以要將FFMPEG和DXVA協(xié)作進(jìn)行硬件解碼,則需要對(duì)AVCodecContext的硬件解碼連接參數(shù)(hwaccel_context)進(jìn)行相應(yīng)的設(shè)置。hwaccel_context是一個(gè)dxva_context場(chǎng)景的指針,其包括2個(gè)回調(diào)函數(shù)get_format和get_buffer2,get_format用于返回硬件解碼的像素類型,get_buffer2用于向DXVA提供解碼后的圖像輸出(即與解碼視頻輸出接口對(duì)應(yīng))。
S6:通過FFMPEG的解碼函數(shù)(avcodec_decode_video2),對(duì)需要解碼的視頻流(視頻流根據(jù)網(wǎng)絡(luò)地址預(yù)先獲取)進(jìn)行解碼;解碼后的圖像會(huì)通過解碼函數(shù)進(jìn)行返回;返回的值是一個(gè)包含IDirect3DSurface9的指針。通過S102中的解碼圖像顯示接口顯示解碼后的圖像。
本發(fā)明實(shí)施例提供的實(shí)現(xiàn)上述方法的基于DXVA進(jìn)行硬件解碼H264視頻流的系統(tǒng),包括DXVA功能接入接口創(chuàng)建模塊、視頻解碼服務(wù)接口創(chuàng)建模塊、最優(yōu)硬件解碼參數(shù)獲取模塊、解碼視頻輸出接口創(chuàng)建模塊、硬件解碼接口創(chuàng)建模塊、FFMPEG關(guān)聯(lián)模塊、解碼顯示模塊和視頻流獲取模塊。
DXVA功能接入接口創(chuàng)建模塊用于:通過多媒體編程接口(Direct3D9)創(chuàng)建DXVA功能接入接口;具體工作流程為:通過接入接口創(chuàng)建函數(shù)創(chuàng)建DXVA功能接入接口;通過Direct3D9的入口接口創(chuàng)建解碼圖像顯示接口;通過解碼圖像顯示接口對(duì)DXVA功能接入接口進(jìn)行初始化。
視頻解碼服務(wù)接口創(chuàng)建模塊用于:通過DXVA功能接入接口創(chuàng)建視頻解碼服務(wù)接口;具體工作流程為:對(duì)DXVA功能接入接口進(jìn)行重置;調(diào)用DXVA功能接入接口的設(shè)備句柄獲取函數(shù),獲取一個(gè)設(shè)備句柄;調(diào)用DXVA功能接入接口的視頻服務(wù)獲取函數(shù),通過所述設(shè)備句柄創(chuàng)建視頻解碼服務(wù)接口。
最優(yōu)硬件解碼參數(shù)獲取模塊用于:通過視頻解碼服務(wù)接口獲取DXVA硬件解碼器中所有的硬件解碼級(jí)別,分別獲取每個(gè)解碼級(jí)別的最優(yōu)硬件解碼參數(shù);具體工作流程為:調(diào)用視頻解碼服務(wù)接口的硬件解碼級(jí)別獲取函數(shù),獲取DXVA硬件解碼器中所有的硬件解碼級(jí)別;調(diào)用硬件解碼參數(shù)獲取函數(shù),獲取每個(gè)解碼級(jí)別的最優(yōu)硬件解碼參數(shù)。
解碼視頻輸出接口創(chuàng)建模塊用于:調(diào)用視頻解碼服務(wù)接口的表面創(chuàng)建函數(shù),創(chuàng)建解碼視頻輸出接口。
硬件解碼接口創(chuàng)建模塊用于:調(diào)用視頻解碼服務(wù)接口的視頻解碼創(chuàng)建函數(shù),創(chuàng)建硬件解碼接口。
FFMPEG關(guān)聯(lián)模塊用于:將FFMPEG分別與最優(yōu)硬件解碼參數(shù)、解碼視頻輸出接口和硬件解碼接口關(guān)聯(lián);具體工作流程為:對(duì)FFMPEG進(jìn)行初始化,與DXVA關(guān)聯(lián)形成DXVA連接場(chǎng)景;分別將最優(yōu)硬件解碼參數(shù)、解碼視頻輸出接口和硬件解碼接口,賦值至DXVA連接場(chǎng)景中的對(duì)應(yīng)字段;將賦值后的DXVA連接場(chǎng)景與FFMPEG的結(jié)構(gòu)體數(shù)據(jù)的硬件解碼連接參數(shù)關(guān)聯(lián)。
視頻流獲取模塊用于:根據(jù)網(wǎng)絡(luò)地址獲取需要解碼的視頻流。
解碼顯示模塊用于:通過FFMPEG對(duì)需要解碼的視頻流進(jìn)行解碼并顯示,具體工作流程為:通過FFMPEG的解碼函數(shù)對(duì)需要解碼的視頻流進(jìn)行解碼;通過所述解碼圖像顯示接口顯示解碼后的圖像。
本發(fā)明不局限于上述實(shí)施方式,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也視為本發(fā)明的保護(hù)范圍之內(nèi)。本說明書中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員公知的現(xiàn)有技術(shù)。