- 編碼器編碼出的H264碼流格式默認為字節(jié)流AnnexB格式,如下圖所示每一個NALU單元前都有一個起始碼底循,起始碼對于一幀的首個NALU為0x00 00 00 01,其余的為0x 00 00 01装获。
- image.png
2.一個NALU單元篙梢,其由NALU Header 和EBSP組成。NALU Header占位1Byte
SODB:數(shù)據(jù)比特串逆航,h264最原始的編碼數(shù)據(jù)
RBSP: 原始字節(jié)序列載荷鼎文,在SODB的后面填加了結(jié)尾比特(RBSP trailing bits 一個bit“1”)若干比特“0”,以便字節(jié)對齊。
EBSP 擴展字節(jié)序列載荷因俐,在RBSP基礎(chǔ)上填加了仿校驗字節(jié)(0X03)它的原因是: 在NALU加到Annexb上時漂问,需要添加每組NALU之前的開始碼 StartCode,如果該NALU對應的slice為一幀的開始則用4位字節(jié)表示,0x00000001,否則用3位字節(jié)表示 0x000001.為了使NALU主體中不包括與開始碼相沖突的數(shù)據(jù)女揭,在編碼時蚤假,每遇到兩個字節(jié)連續(xù)為0,就插入一個字節(jié)的0x03吧兔。解碼時將0x03去掉磷仰。 也稱為脫殼操作。
image.png
image.png
- NALU Header說明
字段名 | 字段大小 | 字段說明 |
---|---|---|
forbidden_bit | 1bit | 如果有語法沖突境蔼,則為 1灶平。當網(wǎng)絡識別此單元存在比特錯誤時,可將其設為 1箍土,以便接收方丟掉該單元 |
nal_reference_bit | 2bit | 用來指示該NALU 的重要性等級逢享。值越大,表示當前NALU越重要吴藻。具體大于0 時取何值瞒爬,沒有具體規(guī)定。 |
nal_unit_type | 5bit | image.png
|
- 常用nalu_type:
NALU類型 | 重要程度 | nalu_type |
---|---|---|
0x67 (0 11 00111) SPS | 非常重要 | type = 7 |
0x68 (0 11 01000) PPS | 非常重要 | type = 8 |
0x65 (0 11 00101) IDR幀 關(guān)鍵幀 | 非常重要 | type = 5 |
0x61 (0 11 00001) I幀 | 重要 | type=1 非IDR的I幀不大常見 |
0x41 (0 10 00001) P幀 | 重要 | type = 1 |
0x01 (0 00 00001) B幀 | 不重要 | type = 1 |
0x06 (0 00 00110) SEI | 不重要 | type = 6 |
image.png
從前面的分析我們知道沟堡,VCL層出來的是編碼完的視頻幀數(shù)據(jù)侧但,這些幀可能是I、B航罗、P幀禀横,而且這些幀可能屬于不同的序列,再者同一個序列還有相對應的一套序列參數(shù)集和圖片參數(shù)集等等粥血,所以要完成視頻的解碼柏锄,不僅需要傳輸VCL層編碼出來的視頻幀數(shù)據(jù)酿箭,還需要傳輸序列參數(shù)集、圖像參數(shù)集等數(shù)據(jù)趾娃。
參數(shù)集:包括序列參數(shù)集 SPS 和圖像參數(shù)集 PPS
- SPS 包含的是針對一連續(xù)編碼視頻序列的參數(shù)七问,如標識符 seq_parameter_set_id、幀數(shù)及 POC 的約束茫舶、參考幀數(shù)目械巡、解碼圖像尺寸和幀場編碼模式選擇標識等等。
- PPS對應的是一個序列中某一幅圖像或者某幾幅圖像饶氏,其參數(shù)如標識符 pic_parameter_set_id讥耗、可選的 seq_parameter_set_id、熵編碼模式選擇標識疹启、片組數(shù)目古程、初始量化參數(shù)和去方塊濾波系數(shù)調(diào)整標識等等。