openh264使用指南

來源:互聯網
上載者:User
openh264使用指南 概述

目前openh264官網只有一些問答,關鍵的開發資料全在github頁的的wiki頁面(https://github.com/cisco/openh264/wiki)

同樣官方的二進位庫也在github頁的release頁面上提供下載(https://github.com/cisco/openh264/releases)

此文章所述皆為windows平台,其他平台使用類似。此文章所使用的openh264版本為1.6,openh264沒有提供匯入庫,只能使用動態載入的方式使用。 使用 擷取對象

首先使用LoadLibrary和GetProcAddressAPI擷取到dll提供的函數介面。一共有6個介面

WelsCreateDecoder;WelsCreateSVCEncoder;WelsDestroyDecoder;WelsDestroySVCEncoder;WelsGetCodecVersion;WelsGetCodecVersionEx;

調用WelsCreateDecoder介面可以擷取解碼器對象。
調用WelsCreateSVCEncoder介面可以擷取編碼器對象。

此節內容並沒有在官方文檔中寫明,所以在此特別說明。

擷取到的是一個c++對象指標,通過這個指標,可以調用對象的方法。對象的標頭檔在源碼的codec\api\svc目錄下的codec_api.h(官方文檔中對此也沒有做出說明)。 編碼器

通過WelsCreateSVCEncoder介面擷取到的對象是ISVCEncoder類型指標。 初始化

首先調用對象的GetDefaultParams方法擷取到預設的參數結構,然後覆蓋自己的參數,具體值根據實際情況決定,參數的含義參考文檔。
其中需要注意的是iSpatialLayerNum,指定要輸出幾路碼流,通常設為1。
然後要將參數中的sSpatialLayers碼流參數數組的參數也填為指定碼流的參數。數組元素的數量由iSpatialLayerNum決定。

調用對象的InitializeExt方法,傳入修改過的參數,初始化編碼器對象。
然後調用

int videoFormat = videoFormatI420;SetOption(ENCODER_OPTION_DATAFORMAT, &videoFormat);

設定傳入映像的格式,目前只支援yuv420,所以這句是固定的。
至此編碼器參數設定的已經完成。 編碼

真正的編碼需要調用對象的EncodeFrame方法。方法需要兩個參數,一個SSourcePicture指標類型的用來存放待編碼的yuv資料,一個SFrameBSInfo指標類型的用來擷取編碼後的NAL單中繼資料。
SSourcePicture類型的對象內容如下:
iPicWidth:傳入映像寬度。
iPicHeight:傳入映像高度。
iColorFormat:傳入映像格式,目前只有一種videoFormatI420。
iStride:yuv3個通道的行寬數組。
pData:yuv3個通道的資料指標數組。
調用EncodeFrame方法,傳入正確填充的SSourcePicture指標類型的參數和置零的SFrameBSInfo指標型別參數。
然後查看傳回值,如果傳回值為0並且SFrameBSInfo型別參數的eFrameType欄位不等於videoFrameTypeSkip說明有資料被編碼出來。
資料存放在SFrameBSInfo型別參數的sLayerInfo結構數組中。其中每個結構體中的pBsBuf表示編碼得到的資料,
而長度是結構體pNalLengthInByteint數組加起來的和,數組的長度由結構體的iNalCount成員表示。

而編碼得到的資料記憶體不需要釋放,編碼器每次調用對象的EncodeFrame方法時會重用這塊記憶體,也就是說編碼出來的資料的在下次調用對象的EncodeFrame方法前有效。在銷毀編碼器的時候釋放這塊記憶體。 銷毀

調用編碼器的對象的Uninitialize方法,然後調用WelsDestroySVCEncoder介面,傳入之前獲得的編碼器對象指標。即可銷毀對象,釋放資源。 解碼器

通過WelsCreateDecoder介面擷取到的對象是ISVCDecoder類型指標。 初始化

建立一個SDecodingParam類型的空的參數結構體,,具體值根據實際情況決定,參數的含義參考文檔。需要特別說明的是bParseOnly欄位,便是是否要僅僅解析內容,通常用來測試,所以正常使用的時候設為false。

調用解碼器對象的Initialize方法,傳入填充正確的SDecodingParam型別參數。 解碼

真正的解碼需要調用解碼器對象的DecodeFrameNoDelay方法,此方法需要4個參數,第一個unsigned char指標型別參數表示傳入的NAL單元起始的地址,第二個int型參數表示NAL單元的長度。第三個unsigned char指標數群組類型參數用來接收解碼完的映像資料,需要提前分配好數組空間,但是實際的每個指標指向的記憶體不用分配。第四個是置空的SBufferInfo指標型別參數,擷取解碼的資料的一些資訊。

調用解碼器對象的DecodeFrameNoDelay方法,傳入對應的參數,接收傳回值,如果返回後等於0並且,SBufferInfo型別參數中的iBufferStatus等於1。就代表成功解碼出了資料。

解碼出的映像資料按照通道分別存放在傳入的第三個參數的指標數組裡。SBufferInfo型別參數中的UsrData.sSystemBuffer.iWidth指示映像的寬度,SBufferInfo型別參數中的UsrData.sSystemBuffer.iHeight指示映像的高度,SBufferInfo型別參數中的sDstBufInfo.UsrData.sSystemBuffer.iStride數組指示每個通道的行寬。
根據這3個參數就可以將解碼得到資料中的有效映像資料拿出來。 銷毀

調用解碼器的對象的Uninitialize方法,然後調用WelsDestroyDecoder介面,傳入之前獲得的解碼器對象指標。即可銷毀對象,釋放資源。

相關關鍵詞:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.