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