邏輯概念-圖片是如何被處理的
- 對(duì)于輸入的每一幀圖片稿械,首先將整張圖片的數(shù)據(jù)劃分成多個(gè)塊泻红,稱之為宏塊谓着,一個(gè)宏塊由16×16亮度像素和附加的一個(gè)8×8 Cb 和一個(gè) 8×8 Cr 彩色像素塊組成
- 若干個(gè)宏塊組合在一起渡讼,稱之為片绪商,片存在的意義是苛谷,在處理數(shù)據(jù)的時(shí)候,片的預(yù)測是不能以其他片的數(shù)據(jù)為參考的格郁,這樣預(yù)測的誤差就只會(huì)在這個(gè)片內(nèi)腹殿,而不會(huì)擴(kuò)散
- 宏塊有三種類型
- I宏塊:利用從當(dāng)前片中已解碼的像素作為參考進(jìn)行幀內(nèi)預(yù)測
- P宏塊:利用前面已編碼圖像作為參考進(jìn)行幀內(nèi)預(yù)測,一個(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ù)測
這樣整個(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ù)語法結(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è)包含一定語法元素的可變長字節(jié)字符串迄沫,例如NALU可以攜帶一個(gè)編碼片,ABC型數(shù)據(jù)分割或一個(gè)序列或圖像參數(shù)集
- 每個(gè)NAL單元由一個(gè)字節(jié)的頭和一個(gè)包含可變場編碼符號(hào)的字符串組成
NALU頭
頭部包含三個(gè)定長比特區(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ù)測睬捶,高于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)和檢測失敗徽惋,網(wǎng)關(guān)可以選擇從NAL流中去掉這個(gè)NAL單元,也可以把已知被破壞的NAL單元傳給接收端座韵,在這種情況下险绘,智能的解碼器將常識(shí)重構(gòu)這個(gè)NAL單元,而非智能的解碼器則直接簡單地拋棄這個(gè)NAL單元
RBSP單元的類型
NAL單元的頭信息定義了RBSP單元的類型
- 序列參數(shù)集SPS包含的是針對(duì)一連續(xù)編碼視頻序列的參數(shù)誉碴,如標(biāo)識(shí)符seq_parameter_set_id宦棺、幀數(shù)及POC的約束、參考幀數(shù)黔帕、解碼圖像尺寸和幀場編碼模式選擇標(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封裝),或者通過起始碼檢測(采用比特流方式)澡为,從傳輸碼流中獲取NAL單元數(shù)據(jù)
- 從NAL單元中提取出RBSP語法結(jié)構(gòu)漂坏,按照下圖的流程處理RBSP語法結(jié)構(gòu)
-
對(duì)于NAL單元的解碼過程,其輸入時(shí)NAL單元媒至,輸出結(jié)果是經(jīng)過解碼的當(dāng)前圖像的樣點(diǎn)值
NAL單元解碼