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