本發(fā)明涉及視頻解碼領域,具體涉及一種用于WP手機進行H264硬件解碼的方法和一種用于WP手機進行H264硬件解碼的系統(tǒng)。
背景技術:
H264是一種當前較為流行的高清視頻編碼解碼規(guī)范,可以有效壓縮視頻體積,利于存儲和網絡播放,但視頻播放時,需要對視頻源進行解碼,解碼分為硬解和軟解。Windows Phone,簡稱WP,是微軟公司推出的一款手機操作系統(tǒng)。
如今,各種直播越發(fā)流行,足不出戶,便可通過手機觀看到游戲、娛樂等精彩的直播內容,例如用戶通過WP手機訪問服務器,從而獲取視頻流,然后WP手機對視頻流進行H264硬件解碼,邊可觀看到直播,但如今大多數WP手機H264硬件解碼方式一般采用SDK(Software Development Kit,軟件開發(fā)工具包)提供的MediaElement(視頻播放)接口,其解碼過程繁瑣,且易出錯。
技術實現要素:
針對現有技術中存在的缺陷,本發(fā)明的目的在于提供一種用于WP手機進行H264硬件解碼的方法和一種用于WP手機進行H264硬件解碼的系統(tǒng),整個解碼過程控制方便,且解碼效率高。
為達到以上目的,本發(fā)明采取的技術方案是:提供一種用于WP手機進行H264硬件解碼的方法,用于在Windows 10系統(tǒng)下對視頻流進行解碼,包括以下步驟:
步驟S1:獲取直播間視頻的流地址,并獲取流地址對應的視頻流;
步驟S2:將DXVA硬件解碼器和Direct3D11硬件解碼器初始化,并將DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接;
步驟S3:使用DXVA硬件解碼器和Direct3D11硬件解碼器對視頻流進行解碼,得到圖像。
在上述技術方案的基礎上,所述步驟S2中初始化DXVA硬件解碼器和Direct3D11硬件解碼器的具體步驟為:
步驟S2.1:創(chuàng)建IMFDXGIDeviceManager接口和ID3D11VideoDevice接口;
步驟S2.2:獲取硬件解碼級別,根據硬件解碼級別獲取最優(yōu)的硬件解碼參數結構;
步驟S2.3:創(chuàng)建含有多個紋理表面的ID3D11Texture2D接口,且給ID3D11Texture2D接口的每個紋理表面創(chuàng)建一ID3D11VideoDecoderOutputView接口;
步驟S2.4:創(chuàng)建ID3D11VideoDecoder接口,并初始化FFMPEG中的AVD3D11VAContext結構。
在上述技術方案的基礎上,所述IMFDXGIDeviceManager接口通過MFCreateDXGIDeviceManager函數創(chuàng)建。
在上述技術方案的基礎上,所述ID3D11VideoDevice接口的創(chuàng)建方法為:
調用IMFDXGIDeviceManager接口中的ResetDevice方法將Direct3D11硬件解碼器重置,然后調用IMFDXGIDeviceManager接口中的OpenDeviceHandle方法獲取一設備句柄,并調用IMFDXGIDeviceManager接口中的GetVideoService方法通過設備句柄創(chuàng)建ID3D11VideoDevice接口。
在上述技術方案的基礎上,所述ID3D11Texture2D接口通過ID3D11Device接口的CreateTexture2D方法創(chuàng)建,所述ID3D11Texture2D接口用于圖像輸出,所述ID3D11VideoDecoderOutputView接口通過調用ID3D11VideoDevice接口的CreateVideoDecoderOutputView方法創(chuàng)建。
在上述技術方案的基礎上,所述ID3D11VideoDecoder接口通過調用ID3D11VideoDevice接口的CreateVideoDecoder方法創(chuàng)建。
在上述技術方案的基礎上,將ID3D11VideoDecoderOutputView接口和ID3D11VideoDecoder接口賦值給AVD3D11VAContext結構來完成AVD3D11VAContext結構的初始化。
在上述技術方案的基礎上,所述步驟S2中DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接的方法為:將AVD3D11VAContext結構賦值給FFMPEG程序的AVCodecContext結構中的硬件解碼環(huán)境hwaccel_context,其中hwaccel_context為AVD3D11VAContext結構的指針。
在上述技術方案的基礎上,所述步驟S3的具體步驟為:
S3.1:調用FFMPEG程序中的avcodec_decode_video2函數對視頻流進行解碼;
S3.2:通過Direct3D11硬件解碼器的ID3D11DeviceContext接口中的Draw方法顯示出解碼后的圖像。
本發(fā)明還提供一種用于WP手機進行H264硬件解碼的系統(tǒng),包括接收端和控制端;
所述接收端用于接收播間視頻的流地址,并根據流地址獲取流地址對應的視頻流,然后將視頻流發(fā)送給控制端;
所述控制端用于將DXVA硬件解碼器和Direct3D11硬件解碼器初始化,并將DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接,然后調用FFMPEG程序中的avcodec_decode_video2函數對視頻流進行解碼,得到解碼后的圖像。
與現有技術相比,本發(fā)明的一種用于WP手機進行H264硬件解碼的方法的優(yōu)點在于:在直播間拉取視頻流,將DXVA硬件解碼器和Direct3D11硬件解碼器初始化后,使DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接,然后在WP手機上進行H264硬件解碼,且整個解碼過程不必依賴于SDK提供的MediaElement接口,能夠對整個解碼以及顯示流程實現完全自主控制。
本發(fā)明的一種用于WP手機進行H264硬件解碼的系統(tǒng)的優(yōu)點在于:用戶僅需拉取直播間的視頻流,便可便捷的在WP手機上通過DXVA硬件解碼器和Direct3D11硬件解碼器進行硬件解碼的方式,對視頻流進行硬件解碼,從而便捷的觀看到主播的直播。
附圖說明
圖1為本發(fā)明一種用于WP手機進行H264硬件解碼的方法的流程圖。
具體實施方式
以下結合附圖對本發(fā)明作進一步詳細說明。
參見圖1所示,本發(fā)明提供一種用于WP手機進行H264硬件解碼的方法,用于在WP手機上對視頻流進行硬件解碼后播放,本實施例中,WP手機上運行的操作系統(tǒng)為版本號為Windows 10的操作系統(tǒng),該方法包括以下步驟:
步驟S1:獲取直播間視頻的流地址,并獲取流地址所對應的視頻流,流地址和視頻流可以通過訪問直播公司的服務器進行獲取。
步驟S2:將DXVA硬件解碼器和Direct3D11硬件解碼器初始化,并將DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接,即DXVA硬件解碼器和Direct3D11硬件解碼器均與FFMPEG程序間建立連接。DXVA(DirectX Video Acceleration,視頻硬件加速)是微軟公司定制的視頻加速規(guī)范。Direct 3D是微軟公司出品的3D圖形API(Application Programming Interface,應用程序編程接口),Direct3D11是Direct3D的其中一個版本,本實施例所需要用到的為Direct3D11中與視頻解碼相關的接口。FFMPEG(Fast Forward Mpeg)是一套用來記錄以及轉換數字音頻和數字視頻,并將數字音頻和數字視頻轉化為流的開源計算機程序。初始化DXVA硬件解碼器和Direct3D11硬件解碼器的具體步驟為:
步驟S2.1:創(chuàng)建IMFDXGIDeviceManager接口和ID3D11VideoDevice接口。IMFDXGIDeviceManager接口通過MFCreateDXGIDeviceManager函數創(chuàng)建。ID3D11VideoDevice接口的創(chuàng)建方法為:調用IMFDXGIDeviceManager接口中的ResetDevice方法將Direct3D11硬件解碼器重置,然后調用IMFDXGIDeviceManager接口中的OpenDeviceHandle方法獲取一設備句柄deviceHandle,并調用IMFDXGIDeviceManager接口中的GetVideoService方法通過設備句柄deviceHandle創(chuàng)建ID3D11VideoDevice接口。IMFDXGIDeviceManager接口是UWP中DXVA功能的入口接口,UWP即Windows通用應用平臺,是Windows 10系統(tǒng)中Universal Windows Platform的簡稱。MFCreateDXGIDeviceManager函數為微軟的Media Foundation中的API函數的接口,MFCreateDXGIDeviceManager用于Media Foundation利用Direct3D11進行硬件解碼,Media Foundation是微軟公司推出的新一代多媒體應用庫,其目的在于給Windows操作系統(tǒng)平臺提供一個統(tǒng)一的多媒體影音解決方案,開發(fā)者可以通過Media Foundation播放視頻或聲音文件。ID3D11VideoDevice接口是用來創(chuàng)建資源表面和創(chuàng)建硬件解碼器的接口。ResetDevice方法、OpenDeviceHandle方法和GetVideoService方法均為IMFDXGIDeviceManager接口中的功能方法。
步驟S2.2:調用ID3D11VideoDevice接口的GetVideoDecoderProfile方法,獲取硬件解碼級別,然后根據硬件解碼級別調用ID3D11VideoDevice接口中的GetVideoDecoderConfig方法獲取硬件解碼參數D3D11_VIDEO_DECODER_CONFIG結構,D3D11_VIDEO_DECODER_CONFIG表示最優(yōu)的硬件解碼參數結構。
步驟S2.3:創(chuàng)建含有多個紋理表面的ID3D11Texture2D接口,且給ID3D11Texture2D接口的每個紋理表面創(chuàng)建一ID3D11VideoDecoderOutputView接口。ID3D11Texture2D接口用于硬件解碼的圖像輸出,解碼后的圖像會存儲在該接口中,然后圖像通過該接口進行繪制顯示。ID3D11Texture2D接口通過ID3D11Device接口的CreateTexture2D方法創(chuàng)建,ID3D11Texture2D接口用來表示一個Direct3D11設備,Direct3D11設備用來創(chuàng)建資源和枚舉顯示適配器性能。ID3D11VideoDecoderOutputView接口是ID3D11Texture2D接口的紋理的一個視圖,用于解碼器保存解碼后的圖像。
步驟S2.4:創(chuàng)建ID3D11VideoDecoder接口,并初始化FFMPEG中的AVD3D11VAContext結構。D3D11VideoDecoder接口是DXVA硬件解碼器的解碼接口。D3D11VideoDecoder接口通過調用ID3D11VideoDevice接口中的CreateVideoDecoder方法創(chuàng)建。AVD3D11VAContext結構用于向FFMPEG程序提供進行DXVA和D3D11硬件解碼的上下文環(huán)境。將ID3D11VideoDecoderOutputView接口和ID3D11VideoDecoder接口賦值給AVD3D11VAContext結構來完成AVD3D11VAContext結構的初始化。
DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接的方法為:將AVD3D11VAContext結構賦值給FFMPEG程序的AVCodecContext結構中的硬件解碼環(huán)境hwaccel_context。AVCodecContext結構是FFMPEG程序中解碼函數avcodec_decode_video2的重要解碼環(huán)境,因解碼函數avcodec_decode_video2在默認情況下是進行軟件解碼的,為了完成本發(fā)明的硬件解碼過程,需對AVCodecContext結構進行相應設置,hwaccel_context即為AVCodecContext結構中的設置字段,hwaccel_context表示硬件解碼環(huán)境上下文,hwaccel_context是一個AVD3D11VAContext結構的指針。
步驟S3:使用DXVA硬件解碼器和Direct3D11硬件解碼器,對視頻流進行解碼,得到圖像。具體的為:調用FFMPEG程序中的avcodec_decode_video2函數對視頻流進行解碼,解碼后得到的圖像會通過解碼函數avcodec_decode_video2進行返回,返回的是一個包含ID3D11VideoDecoderOutputView接口的指針,然后通過Direct3D11硬件解碼器的ID3D11DeviceContext接口中的Draw方法顯示出解碼后的圖像,完成在WP手機上的H264硬件解碼過程,Draw為ID3D11DeviceContext接口中的一個函數,用以繪制非索引和非實例化圖文。
通過上述步驟,在直播間拉取視頻流,將DXVA硬件解碼器和Direct3D11硬件解碼器初始化后,使DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接,然后在WP手機上進行H264硬件解碼,且整個解碼過程不必依賴于SDK提供的MediaElement接口,能夠對整個解碼以及顯示流程實現完全自主控制。
本發(fā)明還提供一種采用上述方法的用于WP手機進行H264硬件解碼的系統(tǒng),該系統(tǒng)包括接收端和控制端,接收端用于接收播間視頻的流地址,并根據流地址獲取流地址對應的視頻流,然后將視頻流發(fā)送給控制端;控制端用于將DXVA硬件解碼器和Direct3D11硬件解碼器初始化,并將DXVA硬件解碼器和Direct3D11硬件解碼器與FFMPEG程序間建立連接,然后調用FFMPEG程序中的avcodec_decode_video2函數對視頻流進行解碼,得到解碼后的圖像。
本發(fā)明不局限于上述實施方式,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也視為本發(fā)明的保護范圍之內。本說明書中未作詳細描述的內容屬于本領域專業(yè)技術人員公知的現有技術。