一鸽斟、H265概述
H265/HEVC(Hight Efficiency Video Coding)是由ITU-T和ISO/IEC兩大組織在H264/AVC的基礎(chǔ)之上推出的新一代高效視頻編碼標(biāo)準班巩,主要為應(yīng)對高清和超高清視頻在網(wǎng)絡(luò)傳輸和數(shù)據(jù)存儲方面帶來的挑戰(zhàn)。上一篇文章對H264/AVC視頻碼流進行了詳細的分析,本文繼續(xù)從數(shù)據(jù)處理的角度對H265/HEVC視頻碼流進行詳細分析。
二、H265分層結(jié)構(gòu)
H265的分層結(jié)構(gòu)與H264類似瓢谢,分為視頻編碼層(VCL:Video Code Layer)和網(wǎng)絡(luò)抽象層(NAL:Network Abstract Layer)。
VCL層:對視頻的原始數(shù)據(jù)進行壓縮驮瞧,包含原始的視頻數(shù)據(jù)氓扛。
NAL層:將視頻壓縮數(shù)據(jù)根據(jù)內(nèi)容不同劃分成不同類型的NALU單元進行網(wǎng)絡(luò)傳輸。
三论笔、H265碼流結(jié)構(gòu)
H265原始碼流(裸流)是由多個NAL單元組成的采郎,具體如下圖所示:
...... | NALU | NALU | NALU | ...... |
---|
NALU單元是由什么組成的呢?和H264的NALU單元組成一樣狂魔,主要由三部分組成蒜埋,具體如下圖所示:
Start Code | NALU Header | NALU Payload |
---|
1.Start Code
Start Code,即開始碼最楷,一般為4字節(jié)或3字節(jié)整份,必須是“0x00 0x00 0x00 0x01”或“0x00 0x00 0x01”,用來表示一個NALU單元的開始籽孙。
2.NALU Header
NALU Header烈评,占2個字節(jié),由forbidden_bit(1bit)犯建,nal_unit_type(6bits)讲冠,nuh_layer_id(6bit),nuh_temporal_id_plus1(3bit)四部分組成适瓦,具體如下圖所示:
(1)forbidden_bit(1bit)
F禁止位竿开,占用NALU Header的第一個字節(jié)的第一個位,值默認0玻熙,值為1時表示錯誤否彩,當(dāng)網(wǎng)絡(luò)發(fā)現(xiàn)NAL單元有比特錯誤時可設(shè)置該比特為1,以便接收方糾錯或丟掉該單元揭芍。
(2)nal_unit_type(6bits)
Type類型胳搞,占用NALU Header的第一個字節(jié)的第二到七位,用來表示NAL單元的類型称杨,具體取值如下圖所示:
(3)nuh_layer_id(6bit)
LayerId預(yù)留位肌毅,占用NALU Header的第一個字節(jié)的最后一位和第二個字節(jié)的前五位,默認全為0姑原,用于未來擴展悬而。
(4)nuh_temporal_id_plus1(3bit)
TID時域?qū)訕?biāo)號,占用NALU Header的第二個字節(jié)的最后三位锭汛,一般默認值為1笨奠,其值減1為該NALU時域?qū)訕?biāo)號。
3.NALU Payload
NALU Payload唤殴,即視頻壓縮數(shù)據(jù)RBSP般婆,但是嚴格意義上來說,Payload數(shù)據(jù)應(yīng)該是EBSP朵逝,接下來詳細介紹一下H265碼流數(shù)據(jù)中的相關(guān)概念蔚袍,與H264類似。
SODB(String Of Data Bits):原始數(shù)據(jù)比特流
由VCL層產(chǎn)生的的原始數(shù)據(jù)流配名,由于數(shù)據(jù)長度不一定是8的倍數(shù)啤咽,為方便計算機進行處理,就用到了RBSP渠脉。
RBSP(Raw Byte Sequence Payload):原始字節(jié)序列載荷
即在SODB的后面添加了trailing bits宇整,即一個bit 1和若干個bit 0,以便字節(jié)對齊芋膘。
EBSP (Encapsulated Byte Sequence Payload):擴展字節(jié)序列載荷
NALU單元是通過開始碼“0x00 0x00 0x00 0x01”或者“0x00 0x00 0x01”來表示一個NALU單元的開始鳞青,同時H265規(guī)定,當(dāng)檢測到“0x00 0x00 0x00”時为朋,也可以表示當(dāng)前NALU的結(jié)束臂拓。那這樣就會產(chǎn)生一個問題,就是如果在NALU的內(nèi)部潜腻,出現(xiàn)了“0x00 0x00 0x01”或“0x00 0x00 0x00”時該怎么辦埃儿?所以在h265碼流中規(guī)定每有兩個連續(xù)的“0x00 0x00”,就增加一個“0x03”,從而預(yù)防壓縮后的數(shù)據(jù)與開始碼產(chǎn)生沖突融涣,防止競爭童番。
四、H265數(shù)據(jù)示例
利用UItraEdit工具打開一個H265文件進行數(shù)據(jù)分析威鹿,如下圖所示:
如上圖所示剃斧,我們可以清晰的看到在H265碼流中,是以“0x00 0x00 x00 0x01”為開始碼的忽你,找到開始碼后幼东,后面的兩個字節(jié)表示NALU Header,上圖所示分別標(biāo)注了VPS、SPS根蟹、PPS脓杉、IDR類型。