H.264碼流格式

H.264碼流格式

SODB: String Of Data Bits 原始數據比特流, 熵編碼輸出結果, 以bit爲單位。
RBSP: Raw Byte Sequence Payload 原始字節序列負載, 在SODB最後加上trailing bits補齊爲一個字節
EBSP: Extent Byte Sequence Payload 擴展字節序列負載, RBSP裏面加入防僞起始碼字節(0x03)
NALU: Network Abstraction Layer Units. 網絡抽象層單元, 在EBSP前面加上一個字節的NALU type.

H264起始碼

一個H.264碼流就是很多個NALU的串接,NALU之間靠起始碼分隔,找不到起始碼就找不到下一個NALU的開始,也就找不到當前NALU的結束。因此起始碼對於H.264碼流非常重要。
在264碼流裏面一般會用到兩種起始碼,4字節 0x00 00 00 01或者3字節 0x00 00 01. 一般4字節起始碼用於SPS,PPS和每幀的第一個Slice,3字節起始碼用於其他的NALU(例如多slice時一幀內的非第一slice)。
由於起始碼起到分隔NALU的作用,因此如果RBSP裏面恰好也出現了0x00 00 01的字節組合,解碼端就會誤認爲是下一個NALU的開始,這樣會造成解碼錯誤。因此要破壞掉RBSP裏面的這種字節組合,這就是RBSP到EBSP的過程。


SODB -> RBSP
RBSP = SODB + trailing bits, 以字節爲單位
SODB是以比特爲單位的,熵編碼的最後一個比特可能是一個字節的任意位,這時候要先增加1個rbsp_stop_one_bit, 然後是n個rbsp_alignement_zero_bit.例如SODB寫到一個字節的2比特,會補1個"1",5個"0"比特,寫滿這個字節。


RBSP -> EBSP
EBSP = RBSP 加入防僞起始碼字節(0x03)
遍歷RBSP找 0x00 00 0z z=1,2,3的字節組合,如果發現有這樣的組合,就在0z之前強行插入0x03字節,破壞掉類似起始碼的字節組合.
具體點說就是做一下的操作。(爲什麼對02/03也做這個操作?這點不理解)
0x00 00 00 -----> 0x00 00 03 00
0x00 00 01 -----> 0x00 00 03 01
0x00 00 02 -----> 0x00 00 03 02
0x00 00 03 -----> 0x00 00 03 03
而解碼段,在接收到一個NALU後,對於EBSP,掃描一遍剔除 0x 00 00 03 0z (z=0,1,2,3)之間的03字節,生成RBSP。

EBSP -> NALU  
NALU = 1字節 NALU type | EBSP
NALU type:    1 bit        |      2bits         |     5bits
            禁止比特 恆爲0     nalu重要性比特    nalu類型比特
發佈了40 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章