一秋秤、H264概述
H264是MPEG-4的第十部分屉更,是由ITU-T和ISO/IEC兩大組織聯(lián)合提出的視頻編解碼標(biāo)準(zhǔn)余指,這個(gè)標(biāo)準(zhǔn)通常被稱之為H.264/AVC洋侨。H264編碼是一種主流編碼方式毡熏,本文主要從數(shù)據(jù)處理的角度對(duì)H264視頻碼流進(jìn)行分析坦敌。
二、H264碼流結(jié)構(gòu)
H264原始碼流(裸流)是由多個(gè)NAL單元組成的,具體如下圖所示:
...... | NALU | NALU | NALU | ...... |
---|
NALU單元是由什么組成的呢狱窘?NALU單元主要由三部分組成杜顺,具體如下圖所示:
Start Code | NALU Header | NALU Payload |
---|
1.Start Code
Start Code,即開(kāi)始碼蘸炸,一般為4字節(jié)或3字節(jié)躬络,必須是“0x00 0x00 0x00 0x01”或“0x00 0x00 0x01”,用來(lái)表示一個(gè)NALU單元的開(kāi)始搭儒。
2.NALU Header
NALU Header穷当,1個(gè)字節(jié),由forbidden_bit(1bit)淹禾,nal_reference_bit(2bits)馁菜,nal_unit_type(5bits)三部分組成,具體如下圖所示:
(1)forbidden_bit(1bit)
F禁止位铃岔,占用NALU Header的第一個(gè)位汪疮,值默認(rèn)0,值為1時(shí)表示錯(cuò)誤毁习,當(dāng)網(wǎng)絡(luò)發(fā)現(xiàn)NAL單元有比特錯(cuò)誤時(shí)可設(shè)置該比特為1智嚷,以便接收方糾錯(cuò)或丟掉該單元。
(2)nal_reference_bit(2bits)
NRI重要性指示位纺且,占用NALU Header的第二盏道、三位,用來(lái)表示NAL單元的重要性,取值00~11载碌,取值越大摇天,表示此NAL單元越重要。
(3)nal_unit_type(5bits)
Type類型恐仑,占用NALU Header的第四到八位,用來(lái)表示NAL單元的類型为鳄,具體取值如下圖所示:
3.NALU Payload
NALU Payload裳仆,即視頻壓縮數(shù)據(jù)RBSP,但是嚴(yán)格意義上來(lái)說(shuō)孤钦,Payload數(shù)據(jù)應(yīng)該是EBSP歧斟,接下來(lái)詳細(xì)介紹一下H264碼流數(shù)據(jù)中的相關(guān)概念。
(1)編碼分層
H264編碼主要分為兩層:視頻編碼層(VCL層)和視頻數(shù)據(jù)網(wǎng)絡(luò)抽象層(NAL層)偏形,其中静袖,VCL層對(duì)視頻的原始數(shù)據(jù)進(jìn)行壓縮,NAL層負(fù)載將視頻數(shù)據(jù)組合成NALU單元進(jìn)行網(wǎng)絡(luò)傳輸俊扭。
(2)碼流相關(guān)概念
SODB(String Of Data Bits):原始數(shù)據(jù)比特流
由VCL層產(chǎn)生的的原始數(shù)據(jù)流扭勉,由于數(shù)據(jù)長(zhǎng)度不一定是8的倍數(shù)喷屋,為方便計(jì)算機(jī)進(jìn)行處理瓜浸,就用到了RBSP啄巧。
RBSP(Raw Byte Sequence Payload):原始字節(jié)序列載荷
即在SODB的后面添加了trailing bits,即一個(gè)bit 1和若干個(gè)bit 0尚胞,以便字節(jié)對(duì)齊。
EBSP (Encapsulated Byte Sequence Payload):擴(kuò)展字節(jié)序列載荷
NALU單元是通過(guò)開(kāi)始碼“0x00 0x00 0x00 0x01”或者“0x00 0x00 0x01”來(lái)表示一個(gè)NALU單元的開(kāi)始,同時(shí)H264規(guī)定贮匕,當(dāng)檢測(cè)到0x00 0x00 0x00時(shí),也可以表示當(dāng)前NALU的結(jié)束花枫。那這樣就會(huì)產(chǎn)生一個(gè)問(wèn)題刻盐,就是如果在NALU的內(nèi)部,出現(xiàn)了"0x00 0x00 0x01"或"0x00 0x00 0x00"時(shí)該怎么辦劳翰?所以在h264碼流中規(guī)定每有兩個(gè)連續(xù)的00 00敦锌,就增加一個(gè)0x03,從而預(yù)防壓縮后的數(shù)據(jù)與開(kāi)始碼產(chǎn)生沖突,防止競(jìng)爭(zhēng)磕道。
三供屉、H264數(shù)據(jù)示例
利用UItraEdit工具打開(kāi)一個(gè)H264文件進(jìn)行數(shù)據(jù)分析,如下圖所示:
如上圖所示溺蕉,我們可以清晰的看到在H264碼流中伶丐,是以“0x00 0x00 0x00 0x01”為開(kāi)始碼的,找到開(kāi)始碼后疯特,后面的一個(gè)字節(jié)表示NALU Header哗魂,上圖所示分別標(biāo)注了SPS、PPS漓雅、IDR類型录别。
結(jié)語(yǔ)
本文主要從數(shù)據(jù)處理的角度對(duì)H264視頻碼流數(shù)據(jù)進(jìn)行了分析,這也是音視頻數(shù)據(jù)處理的基礎(chǔ)邻吞,后續(xù)會(huì)針對(duì)音視頻開(kāi)發(fā)技術(shù)進(jìn)行詳細(xì)的介紹组题。