- 圖像picture幀frame場field
- 片slice
-
幀內(nèi)編碼幀I 幀關(guān)鍵幀
-
預(yù)測幀P幀前向預(yù)測編碼幀
-
B幀雙向預(yù)測編碼幀
- 宏塊Macro Block
在H.264中,句法元素被組織成五個層次:序列(sequence)、圖像(frame/field-picture)、片(slice)、宏塊(macroblock)、子塊(sub-block)。
圖像(picture)、幀(frame)、場(field)
視頻壓縮中,一幅圖像(picture)可以分成一幀(frame)或兩場(field)。一般來講,picture可以分為若干個宏塊(macroblock),每個宏塊可以采用不同的預(yù)測編碼類型,整幅圖像各宏塊的類型可以不同。例如I picture只包含intra MB, P picture包含intra MB或predicted MB, B picture包含intra, predicted, 或bi-predicted MB。
I圖像:I宏塊
P圖像:I宏塊、P宏塊
B圖像:I宏塊、P宏塊、B宏塊
片(slice)
在H.264中,一幅圖像可以編碼為一個或多個片(slice),每個slice由宏塊組成,一個宏塊由一個16×16亮度像素和附加的一個8×8 Cb和一個8×8 Cr彩色像素塊組成。宏塊是H.264編碼的基本單位,可以采用不同的編碼類型。slice共有5種類型。slice的目的是為了限制誤碼的擴散和傳輸,使編碼片相互間保持獨立。一個slice編碼之后被打包進一個NALU,NALU除了容納slice還可以容納其它數(shù)據(jù),如序列參數(shù)集SPS、PPS、SEI等。
類型
|
描述
|
支持的框架
|
I frames/slices (Intra)
|
I宏塊
|
全部
|
P frames/slices (Predicted)
|
I宏塊、P宏塊
|
全部
|
B frames/slices (Bi-Predicted)
|
I宏塊、B宏塊
|
擴展和主
|
SI-frames/slices (switching I)
|
SI宏塊(一種特殊的幀內(nèi)編碼宏塊),用于不同編碼流之間的切換
|
擴展
|
SP-frames/slices (switching P)
|
I宏塊、P宏塊,用于不同編碼流之間的切換
|
擴展
|
Intra codedframes/ Intra coded slices/ I-frames/ Key frames
在I幀中,所有宏塊都采用幀內(nèi)預(yù)測的方式,因此解碼時僅用I幀的數(shù)據(jù)就可重構(gòu)完整圖像,不需要參考其他畫面而生成。I幀可以用來快進快退,作為隨機訪問的參考點。I幀用來作為P幀和B幀的參考幀,其質(zhì)量直接影響到其后各幀的質(zhì)量。I幀描述了圖像背景和運動主體的詳情,可以幫助場景切換時重置畫面質(zhì)量。當(dāng)場景進行切換時,可以切換I幀從而更加高效地壓縮P幀和B幀(當(dāng)然這要求編碼器要有場景切換檢測功能)。由于I幀僅進行幀內(nèi)預(yù)測,沒有進行運動估計等幀間預(yù)測,因此I幀的碼率比較高。
在H.264中規(guī)定了兩種類型的I幀:普通I幀(normal Iframes)和IDR幀(InstantaneousDecoding Refresh, 即使解碼刷新)。IDR幀實質(zhì)也是I幀,使用幀內(nèi)預(yù)測。IDR幀的作用是立即刷新,會導(dǎo)致DPB(Decoded Picture Buffer參考幀列表)清空,而I幀不會。所以IDR幀承擔(dān)了隨機訪問功能,一個新的IDR幀開始,可以重新算一個新的序列開始編碼,播放器永遠可以從一個IDR幀播放,因為在它之后沒有任何幀引用之前的幀。如果一個視頻中沒有IDR幀,這個視頻是不能隨機訪問的。所有位于IDR幀后的B幀和P幀都不能參考IDR幀以前的幀,而普通I幀后的B幀和P幀仍然可以參考I幀之前的其他幀。IDR幀阻斷了誤差的積累,而I幀并沒有阻斷誤差的積累。
I 幀編碼的基本流程:
1、進行幀內(nèi)預(yù)測,決定所采用的幀內(nèi)預(yù)測模式。
2、像素值減去預(yù)測值,得到殘差。
3、對殘差進行變換和量化。
4、變長編碼和算術(shù)編碼。
5、重構(gòu)圖像并濾波,得到的圖像作為其它幀的參考幀。
P幀屬于前向預(yù)測的幀間編碼,僅參考前面的最靠近它的I幀或者P幀進行幀間預(yù)測。編碼端在參考幀中找到P幀某點的預(yù)測值以及運動矢量,相減獲取預(yù)測差值,將預(yù)測差值和運動矢量進行編碼后傳輸。解碼端根據(jù)運動矢量從I幀中找出P幀某點的預(yù)測值并與預(yù)測差值相加得到P幀某點樣值,從而可得到完整的P幀。在以前的標(biāo)準(zhǔn)中(如MPEG-2),P幀解碼時只使用前一幀作為參考,在H.264中,解碼時可以使用多幀已解碼的圖像作為參考。P幀可以是其后面P幀的參考幀,也可以是其前后的B幀的參考幀。由于P幀是參考幀,它可能造成解碼錯誤的擴散。由于是差值傳送,P幀的壓縮比較高。在H.264基本配置中僅僅存在I幀和P幀,不存在B幀。
B幀以前面的I或P幀和后面的P幀為參考幀進行預(yù)測,編碼找出B幀某點的預(yù)測值和兩個運動矢量,并取預(yù)測差值和運動矢量傳送。解碼端根據(jù)運動矢量在兩個參考幀中找出預(yù)測值并與差值求和,得到B幀某點樣值,從而可得到完整的B幀。在以前的標(biāo)準(zhǔn)中(如MPEG-2),B幀不作為參考幀,可以使用較低的碼率、降低圖像質(zhì)量而不會影響后續(xù)圖像,解碼時使用兩幀圖像作為參考。在H.264中,B幀可以作為參考幀,解碼時可以使用一幅、兩幅或多幅圖像作為參考,圖像幀的傳輸順序和顯示順序是不同的。B幀壓縮比最高,因為它只反映兩參考幀間運動主體的變化情況,預(yù)測比較準(zhǔn)確。
P 幀和 B 幀編碼的基本流程:
1、進行運動估計,計算采用幀間編碼模式的率失真函數(shù)(節(jié))值。P幀只參考前面的幀,B幀可參考后面的幀。
2、進行幀內(nèi)預(yù)測,選取率失真函數(shù)值最小的幀內(nèi)模式與幀間模式比較,確定采用哪種編碼模式。
3、計算實際值和預(yù)測值的差值。
4、對殘差進行變換和量化。
5、熵編碼,如果是幀間編碼模式,編碼運動矢量。
宏塊(Macro Block)
宏塊是編碼處理的基本單元,通常宏塊大小為16x16個像素。一個編碼圖像首先要劃分成多個塊(4x4 像素)才能進行處理,顯然宏塊應(yīng)該由整數(shù)個塊組成。宏塊分為I、P、B宏塊:I宏塊(幀內(nèi)預(yù)測宏塊)只能利用當(dāng)前片中已解碼的像素作為參考進行幀內(nèi)預(yù)測;P宏塊(幀間預(yù)測宏塊)可以利用前面已解碼的圖像作為參考圖像進行幀內(nèi)預(yù)測;B宏塊(幀間雙向預(yù)測宏塊)則是利用前后向的參考圖像進行幀內(nèi)預(yù)測。
|