轉!!!!Intel media SDK h264編碼去除多餘信息(如分界符,sps等)

原文鏈接https://blog.jianchihu.net/intel-media-sdk-remove-unused.html

使用Intel media SDK硬編碼H264數據時,生成的每一幀H264數據都包含Access unit delimiter+Picture parameter set+Additional information (SEI)。如下圖是使用默認參數生成的一個非IDR幀H264數據。

IDR幀數據結構如下:

根據nal uint type表

可知:
默認編碼IDR幀結構:0x00 00 00 01 09(分隔符)|| 0x00 00 00 01 27(SPS)|| 0x00 00 00 01 28(PPS)|| 0x00 00 00 01 06(SEI)|| 0x00 00 01 25(IDR)
默認編碼非IDR幀結構:0x00 00 00 01 09(分隔符)|| 0x00 00 00 01 28(PPS)|| 0x00 00 00 01 06(SEI)|| 0x00 00 01 21(非IDR)

但是默認編碼有個問題,不是所有播放器可以支持直接播放,測了下VLC不支持(以前文章說過VLC播放帶SEI的視頻花屏問題),PotPlayer可以播放,這個問題在於編碼出來的每幀數據都多了分隔符與SEI以及PPS,不是所有的播放器都去解析這些頭部,這方面NVIDIA Video Codec硬編碼就簡單多了,IDR幀結構就SPS+PPS+IDR,非IDR幀就一個頭部。所以爲了兼容大多數播放器我們需要去掉多餘的分隔符、SEI以及PPS信息,這些信息用途不大,PPS沒必要每幀都帶,反而增加數據量。如何去除呢,一種方法是手動解析這些頭部,然後手動去除,另一種方法是使用編碼的擴展參數,這個編碼擴展參數如果沒認真研究官方文檔,還真不知道怎麼用。

如下是編碼擴展參數如何使用的代碼。代碼中我們將設置的參數放到一個數組中,然後傳遞給編碼參數mfxVideoParam的ExtParam成員。

mfxVideoParam mfxEncParams;
//其他參數設置
//.........
mfxExtCodingOption option;
memset(&option, 0, sizeof(option));
option.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
option.Header.BufferSz = sizeof(option);
//option.RefPicMarkRep = MFX_CODINGOPTION_ON;
option.NalHrdConformance = MFX_CODINGOPTION_OFF;
option.PicTimingSEI = MFX_CODINGOPTION_OFF;
option.AUDelimiter = MFX_CODINGOPTION_OFF;
mfxExtCodingOption2 option2;
memset(&option2, 0, sizeof(option2));
option2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
option2.Header.BufferSz = sizeof(option2);
option2.RepeatPPS = MFX_CODINGOPTION_OFF;
std::vector<mfxExtBuffer*> m_EncExtParams;
m_EncExtParams.push_back((mfxExtBuffer *)&option);
m_EncExtParams.push_back((mfxExtBuffer *)&option2);
mfxEncParams.ExtParam = &m_EncExtParams[0];
mfxEncParams.NumExtParam = m_EncExtParams.size();

mfxExtCodingOption.PicTimingSEI
Set this flag to insert the picture timing SEI with pic_struct syntax element. See sub-clauses D.1.2 and D.2.2 of the ISO /IEC 14496-10 specification for the definition of this syntax element. See the
CodingOptionValue enumerator for values of this option. The default value is ON. 也就是這個成員用於在每幀插入圖像時序SEI信息,默認是開啓的。

mfxExtCodingOption.AUDelimite
Set this flag to insert the Access Unit Delimiter NAL. See the CodingOptionValue enumerator for values of this option.該標誌用於插入分隔符。

mfxExtCodingOption2.RepeatPPS
This flag controls picture parameter set repetition in AVC encoder. Turn ON this flag to repeat PPS with each frame. See the CodingOptionValue enumerator for values of this option. The default value is ON. This parameter is valid only during initialization.用於設置AVC編碼器在每一幀編碼中插入PPS。默認是開啓的。

通過關閉如上編碼參數,即可去除多餘的數據,編碼生成”簡潔”的H264幀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章