H264結構
我們通過H264壓縮技術得到了一幀幀的H264視頻幀, 每一個視頻幀實際上是一個結構化的東西, 我們看下面這個圖:
這張圖的最上面是一串壓縮后的視頻幀序列, 我們?nèi)∑渲械囊粠? 我們可以看到, 每一幀(或者說圖像)都是由多個片組成, 每一個片都是由一個個宏塊組成, 每一個宏塊又可以分成多個子塊, 這就是一個H264幀的結構.
H264編碼分層
H264在編碼的時候分成了兩層: NAL層和VCL層
NAL層
NAL層(Network Abstraction Layer, 視頻數(shù)據(jù)網(wǎng)絡抽象層). 它的作用是拆包和組包, 我們編碼的H264最終要在網(wǎng)絡上進行傳輸, 以太網(wǎng)的傳輸單元是每個包不能超過1500個字節(jié), 而H264的幀往往大于1500字節(jié), 所以我們需要對它進行拆包, 講一個幀拆成多個包進行傳輸. 所有的拆包和組包都是通過NAL層去處理的.
VCL層
VCL層 (Video Coding Layer, 視頻數(shù)據(jù)編碼層). 它的作用就是對視頻原始數(shù)據(jù)進行壓縮.
碼流的基本概念
SODB (String of Data Bits, 原始數(shù)據(jù)比特流), 因為它是流, 所以它的長度不一定是8的整數(shù)倍. 它是由VCL層產(chǎn)生的, 因為它不是8的整數(shù)倍所以處理起來比較麻煩
RBSP (Raw Byte Sequence Payload, SODB + trailing bits) 算法是在SODB最后一位補1, 不按字節(jié)對齊補0, 如果補齊0, 不知道在哪里結束, 所以補1, 如果不夠8位則按位補0.
EBSP (Encapsulate Byte Sequence Payload) 就是生成壓縮流之后, 我們還要在每個幀之前加一個起始位, 起始位一般是十六進制的0001. 但是在整個編碼后的數(shù)據(jù)里, 可能會出來連續(xù)的2個0x00. 那這樣就與起始位產(chǎn)生了沖突, 這應該怎么處理呢? H264規(guī)范里說明了處理2個連續(xù)的0x00, 就額外增加一個0x03, 這樣就能預防壓縮后的數(shù)據(jù)與起始位產(chǎn)生沖突.