邏輯概念-圖片是如何被處理的
- 對(duì)于輸入的每一幀圖片,首先將整張圖片的數(shù)據(jù)劃分成多個(gè)塊,稱之為宏塊,一個(gè)宏塊由16×16亮度像素和附加的一個(gè)8×8 Cb 和一個(gè) 8×8 Cr 彩色像素塊組成
- 若干個(gè)宏塊組合在一起,稱之為片,片存在的意義是,在處理數(shù)據(jù)的時(shí)候,片的預(yù)測(cè)是不能以其他片的數(shù)據(jù)為參考的,這樣預(yù)測(cè)的誤差就只會(huì)在這個(gè)片內(nèi),而不會(huì)擴(kuò)散
- 宏塊有三種類型
- I宏塊:利用從當(dāng)前片中已解碼的像素作為參考進(jìn)行幀內(nèi)預(yù)測(cè)
- P宏塊:利用前面已編碼圖像作為參考進(jìn)行幀內(nèi)預(yù)測(cè),一個(gè)幀內(nèi)編碼的宏塊可進(jìn)一步作宏塊的分割,即 16×16、16×8、8×16 或 8×8 亮度像素塊(以及附帶的彩色像素);如果選了 8×8 的子宏塊, 則可再分成各種子宏塊的分割,其尺寸為 8×8、8×4、4×8 或 4×4 亮度像素塊(以及附帶的彩色像素)
- B宏塊:利用雙向的參考圖像(當(dāng)前和未來的已編碼圖像幀)進(jìn)行幀內(nèi)預(yù)測(cè)
這樣整個(gè)幀流的邏輯結(jié)構(gòu)可以自上向下切分為如下的圖

編碼器的碼流結(jié)構(gòu)
片是最上層的獨(dú)立的數(shù)據(jù)單位,每個(gè)片必須自己攜帶關(guān)于所屬圖像的編號(hào)、大小等基本信息,這些信息在同一圖像的每個(gè)片中都必須是一致的。在編碼時(shí),H.264 的規(guī)范要求將參數(shù)集、片這些獨(dú)立的數(shù)據(jù)單位盡可能各自完整地放入一個(gè)分組中被傳送。這樣可以增強(qiáng)穩(wěn)定性,一個(gè)片的丟失將不會(huì)影響其它片的解碼,還可以通過該片前后的片來恢復(fù)該片的數(shù)據(jù)。

下圖是一個(gè)碼流中所包含的數(shù)據(jù)單位,這里的數(shù)據(jù)單位是指可以獨(dú)立放入一個(gè)組傳輸?shù)募?/p>

一個(gè)序列的第一個(gè)圖像叫做 IDR 圖像(立即刷新圖像),IDR 圖像都是 I 圖像。H.264 引入 IDR 圖像是為了解碼的重同步,當(dāng)解碼器解碼到 IDR 圖像時(shí),立即將參考幀隊(duì)列 清空,將已解碼的數(shù)據(jù)全部輸出或拋棄,重新查找參數(shù)集,開始一個(gè)新的序列。這樣,如果在前一 個(gè)序列的傳輸中發(fā)生重大錯(cuò)誤,如嚴(yán)重的丟包,或其他原因引起數(shù)據(jù)錯(cuò)位,在這里可以獲得重新同步。IDR圖像之后的圖像永遠(yuǎn)不會(huì)引用IDR圖像之前的圖像數(shù)據(jù)來解碼
IDR圖像和I圖像有區(qū)別,IDR圖像一定是一個(gè)I圖像,但是I圖像不一定是IDR圖像;一個(gè)序列中可以有很多的I圖像,I圖像之后的圖像可以引用I圖像之間的圖像做運(yùn)動(dòng)參考
除了參數(shù)集與片片還有其他的數(shù)據(jù)單位,這些數(shù)據(jù)單位可以提供額外的數(shù)據(jù)或同步信息
數(shù)據(jù)語(yǔ)法結(jié)構(gòu)
- 編碼層數(shù)據(jù)VCL:這是編碼處理的輸出,表示被壓縮編碼后的視頻數(shù)據(jù)序列
-
網(wǎng)絡(luò)層數(shù)據(jù)NAL:VCL數(shù)據(jù)在被發(fā)送到網(wǎng)絡(luò)上傳輸或存儲(chǔ)之前,會(huì)先被封裝進(jìn)NAL單元中;一個(gè)NALU包含一組對(duì)應(yīng)于視頻編碼的NALU頭部信息和一個(gè)原始字節(jié)序列負(fù)荷(RBSP)
NAL單元序列
NALU結(jié)構(gòu)
- 一個(gè)NALU定義了可用于基于包和基于比特流系統(tǒng)的基本格式,區(qū)別這兩種格式的方法在于每個(gè)比特流傳輸層都有一個(gè)起始代碼
- 一個(gè)NALU單元結(jié)構(gòu)上是一個(gè)包含一定語(yǔ)法元素的可變長(zhǎng)字節(jié)字符串,例如NALU可以攜帶一個(gè)編碼片,ABC型數(shù)據(jù)分割或一個(gè)序列或圖像參數(shù)集
- 每個(gè)NAL單元由一個(gè)字節(jié)的頭和一個(gè)包含可變場(chǎng)編碼符號(hào)的字符串組成
NALU頭

頭部包含三個(gè)定長(zhǎng)比特區(qū),NALU類型(T)、NAL-REFERENCE-IDC(R)和隱藏比特位(F)
- T用5bit來表示32中不同類型特征,1-12是H264定義的,24-31是用于H264意外的,RTP負(fù)荷規(guī)范使用這些其中的一些值來定義包聚合和氛圍,其他值為H264保留
- R比特用于在重構(gòu)過程中標(biāo)記一個(gè)NAL單元的重要,0表示這個(gè)NAL單元沒有用于預(yù)測(cè),高于0表示NAL單元要用于無漂移重構(gòu),且值越高,對(duì)NAL單元丟失的影響越大
- 隱藏比特位在H264中默認(rèn)是0,當(dāng)網(wǎng)絡(luò)識(shí)別到單元中存在比特錯(cuò)誤時(shí),可以將其設(shè)置為1,如當(dāng)一個(gè)NAL單元在通過網(wǎng)關(guān)時(shí),校驗(yàn)和檢測(cè)失敗,網(wǎng)關(guān)可以選擇從NAL流中去掉這個(gè)NAL單元,也可以把已知被破壞的NAL單元傳給接收端,在這種情況下,智能的解碼器將常識(shí)重構(gòu)這個(gè)NAL單元,而非智能的解碼器則直接簡(jiǎn)單地拋棄這個(gè)NAL單元
RBSP單元的類型
NAL單元的頭信息定義了RBSP單元的類型

- 序列參數(shù)集SPS包含的是針對(duì)一連續(xù)編碼視頻序列的參數(shù),如標(biāo)識(shí)符seq_parameter_set_id、幀數(shù)及POC的約束、參考幀數(shù)、解碼圖像尺寸和幀場(chǎng)編碼模式選擇標(biāo)識(shí)等等
- 圖像參數(shù)集PPS對(duì)應(yīng)的是一個(gè)序列中某一副圖像或幾幅圖像,其參數(shù)如標(biāo)識(shí)符pic_parameter_set_id、可選的seq_parameter_set_id、熵編碼模式選擇標(biāo)識(shí)、片組書目、初始量化參數(shù)和去方塊濾波洗漱調(diào)整標(biāo)識(shí)等等
- 通常,SPS和PPS在片頭信息和數(shù)據(jù)解碼前傳送至解碼器。每個(gè)片的頭信息對(duì)應(yīng)一個(gè)pic_parameter_set_id,PPS被其激活后一直有效到下一個(gè)PPS被激活;類似的,每個(gè)SPS對(duì)應(yīng)一個(gè)seq_parameter_set_id,SPS被激活后將一直有效到下一個(gè)SPS被激活
- 參數(shù)集機(jī)制講一些重要的、改變少的序列參數(shù)和圖像參數(shù)與編碼片分離,并在編碼片之前傳送至解碼端,或者通過其他機(jī)制傳輸
單元解碼過程
- 在進(jìn)行NAL單元解碼過程之前,首先通過RTP協(xié)議解析(采用RTP封裝),或者通過起始碼檢測(cè)(采用比特流方式),從傳輸碼流中獲取NAL單元數(shù)據(jù)
- 從NAL單元中提取出RBSP語(yǔ)法結(jié)構(gòu),按照下圖的流程處理RBSP語(yǔ)法結(jié)構(gòu)
-
對(duì)于NAL單元的解碼過程,其輸入時(shí)NAL單元,輸出結(jié)果是經(jīng)過解碼的當(dāng)前圖像的樣點(diǎn)值
NAL單元解碼

