H.264---碼流格式分析
1、H.264的基本流結構
H.264 的基本流(elementary stream,ES)的結構分為兩層,包括視訊編碼層(VCL)和網路適配層(NAL)。視訊編碼層負責高效的視訊內容表示,而網路適配層負責以網路所要求的恰當的方式對資料進行打包和傳送。引入NAL並使之與VCL分離帶來的好處包括兩方面:1、使訊號處理和網路傳輸分離,VCL 和NAL 可以在不同的處理平臺上實現;2、VCL 和NAL 分離設計,使得在不同的網路環境內,閘道器不需要因為網路環境不同而對VCL位元流進行重構和重編碼。
☆VCL(Video Coding Layer):VCL是對核心演算法引擎,塊,巨集塊及片的語法級別的定義,他最終輸出編碼完的資料 SODB
☆NAL(Net Abstraction Layer):NAL將SODB打包成RBSP然後加上NAL頭,組成一個NALU(NAL單元)
2、VLC層中的結構
常見的I、B、P幀組成影象序列sequence,這裡I幀和IDR幀的區別參考https://www.cnblogs.com/qing1991/p/10085696.html,一幀圖片中可以有一個火多個Slice,一個Slice有多個巨集塊(Macro BLock) ,一個巨集塊包含一個亮度塊和兩個色度塊。
SODB :資料位元串 ---->最原始的編碼資料,即VCL資料
3、NAL層中的結構
一個典型的NALU如下圖所示
3.1 NAL頭介紹
佔一個位元組,由三部分組成forbidden_bit(1bit),nal_reference_bit(2bits)(優先順序),nal_unit_type(5bits)(型別)。
forbidden_bit:
禁止位,預設為0,1為語法有錯誤
nal_reference_bit:
用於在重構過程中標記一個NAL單元的重要性,值越大,越重要。值為0表示這個NAL單元沒有用於預測,因此可被解碼器拋棄而不會有錯誤擴散;值高於0表示此NAL單元要用於無漂移重構,且值越高,對此NAL單元丟失的影響越大
nal_unit_type :NAL型別。參見下表
3.2 RBSP、EBSP
SODB 資料位元串-->最原始的編碼資料
RBSP 原始位元組序列載荷-->在SODB的後面填加了結尾位元(RBSP trailing bits 一個bit“1”)若干位元“0”,以便位元組對齊。EBSP 擴充套件位元組序列載荷-- >在RBSP基礎上填加了仿校驗位元組(0X03)它的原因是: 在NALU加到Annexb上時,需要填加每組NALU之前的開始碼 StartCodePrefix,如果該NALU對應的slice為一幀的開始則用4位位元組表示,ox00000001,否則用3位位元組表示 ox000001.為了使NALU主體中不包括與開始碼相沖突的,在編碼時,每遇到兩個位元組連續為0,就插入一個位元組的0x03。解碼時將0x03去掉。