參考
知乎 視頻拍攝時幀內(nèi)壓縮和幀間壓縮的區(qū)別
知乎 李超 H264基本原理
【H.264/AVC視頻編解碼技術(shù)詳解】十六:幀內(nèi)預(yù)測編碼的基本原理
一、宏塊(Macroblock)。
1.宏塊
宏塊就是悯嗓,把視頻的每一幀(相當于一張圖片)劃分成16*16
的小塊寓调,一塊一塊的依次壓縮哆料,而不是對整張圖片一起壓縮袖裕。這樣降低了計算的復(fù)雜度躺率,比較節(jié)省時間龙宏。一個宏塊又可以分成16*16,16*8,8*16,8*8,8*4,4*8,4*4
,等大小不等的塊棵逊。具體怎么劃分塊大小,要看畫面有多復(fù)雜银酗。一般來說辆影,運動多徒像,細節(jié)多的部分,劃分成小塊來編碼蛙讥;大片的平坦的無變化的锯蛀,劃分成16*16的大塊。下圖就是塊劃分情況键菱,圖選的不好谬墙,選成殘差幀了⊙﹏⊙,分塊狀況還是大致能看出來的经备。
舉例:圖 6.21 顯示了一個殘差幀(沒有進行運動補償)拭抬。H.264 編碼器為幀的每個部分選擇了最佳分割尺寸,使傳輸信息量最小侵蒙,并將選擇的分割加到殘差幀上造虎。在幀變化小的區(qū)域(殘差顯示灰色),選擇 16×16 分割纷闺;多運動區(qū)域(殘差顯示黑色或白色)算凿,選擇更有效的小的尺寸。
2.子塊
H264對比較平坦的圖像使用 16X16 大小的宏塊犁功。但為了更高的壓縮率氓轰,還可以在 16X16 的宏塊上更劃分出更小的子塊。子塊的大小可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4非常的靈活浸卦。相比于早期標準只能按照宏塊或者半個宏塊進行運動補償署鸡,H.264所采用的這種更加細分的宏塊分割方法提供了更高的預(yù)測精度和編碼效率。
上幅圖中限嫌,紅框內(nèi)的 16X16 宏塊中大部分是藍色背景靴庆,而三只鷹的部分圖像被劃在了該宏塊內(nèi),為了更好的處理三只鷹的部分圖像怒医,H264就在 16X16 的宏塊內(nèi)又劃分出了多個子塊炉抒。
這樣再經(jīng)過幀內(nèi)壓縮,可以得到更高效的數(shù)據(jù)稚叹。下圖是分別使用mpeg-2和H264對上面宏塊進行壓縮后的結(jié)果焰薄。其中左半部分為MPEG-2子塊劃分后壓縮的結(jié)果,右半部分為H264的子塊劃壓縮后的結(jié)果扒袖,可以看出H264的劃分方法更具優(yōu)勢塞茅。
二、幀內(nèi)(Intra)壓縮僚稿。
1.幀內(nèi)預(yù)測
幀內(nèi)壓縮類似于圖片壓縮,跟這一幀的前面(或后面)一幀(或幾幀)無關(guān)蟀伸,由當前幀中蚀同,已編碼的部分來推測當前待編碼的這一部分數(shù)據(jù)是什么缅刽。
先看這個圖片
假設(shè)現(xiàn)在是按順序來編碼,第一行已經(jīng)完全編完蠢络,⑤也編完了衰猛,正要壓縮⑥這一塊∩部祝可以看出啡省,它周圍的①②③④⑤,跟⑥簡直一模一樣啊髓霞,如果能用①②③④⑤來推測⑥是什么圖像卦睹,顯然比只壓縮⑥要節(jié)省空間。這就是幀內(nèi)預(yù)測方库。
一般來說结序,視頻的第一幀是幀內(nèi)預(yù)測幀(廢話,它想?yún)⒖计渌麕臄?shù)據(jù)也沒有的參考)纵潦,場景切換時是幀內(nèi)預(yù)測幀(比如視頻里插了一段廣告徐鹤,這個廣告跟視頻里其他的內(nèi)容都無關(guān),用它來預(yù)測還不如我自己編自己省空間)邀层。幀內(nèi)預(yù)測在H.264編碼標準里有以下幾種預(yù)測方法返敬,具體請查看H.264白皮書。
一幅圖像被劃分好宏塊后寥院,對每個宏塊可以進行 9 種模式的預(yù)測劲赠。找出與原圖最接近的一種預(yù)測模式。然后只磷,將原始圖像與幀內(nèi)預(yù)測后的圖像相減得殘差值经磅。再將我們之前得到的預(yù)測模式信息一起保存起來,這樣我們就可以在解碼時恢復(fù)原圖了钮追。
除了幀內(nèi)預(yù)測編碼之外预厌,H.264還定義了一種特殊的編碼模式,即為I_PCM模式元媚。I_PCM模式不對像素塊進行預(yù)測-變換-量化操作轧叽,而是直接傳輸圖像的像素值。在有些時候(如傳輸圖像的不規(guī)則紋理信息刊棕,或低量化參數(shù)條件下)炭晒,該模式比預(yù)測編碼模式效率更高
另外參考【H.264/AVC視頻編解碼技術(shù)詳解】十七:幀內(nèi)預(yù)測編碼的預(yù)測實現(xiàn)方法
2.DCT,CABAC
經(jīng)過幀內(nèi)與幀間的壓縮后甥角,雖然數(shù)據(jù)有大幅減少网严,但還有優(yōu)化的空間∴臀蓿可以將殘差數(shù)據(jù)做整數(shù)離散余弦變換(DCT)震束,去掉數(shù)據(jù)的相關(guān)性怜庸,進一步壓縮數(shù)據(jù)。
做完 DCT 后垢村,還不夠割疾,還要進行 CABAC 進行無損壓縮。
三嘉栓、幀間(Inter)壓縮宏榕。
幀間壓縮是,由這一幀的前(或后)一幀(或幾幀)來推測當前待壓縮的這一部分數(shù)據(jù)是什么侵佃。
下圖是一個視頻序列中連續(xù)的兩幀麻昼。(我真沒偷懶,這真的是倆不同的幀趣钱,不信你看書的位置和人的表情都變了)
如果攝像頭沒有晃來晃去涌献,那么,在連續(xù)的視頻圖像里面首有,前后兩幀的差別真的很小燕垃,比一張圖片中連續(xù)兩個宏塊的差別還要小,這時用幀間壓縮的效果會比幀內(nèi)壓縮的效果好井联。
Block Matching 就是塊匹配卜壕,就是找找看前面已經(jīng)編碼的幾幀里面,和我當前這個塊最類似的一個塊烙常,這樣我就不用編碼當前塊的內(nèi)容了轴捎,只需要編碼當前塊和我找到的那個塊的差(稱為殘差)就可以了。找最像的塊的過程叫運動搜索(Motion Search)蚕脏,又叫運動估計(Motion Estimation)侦副。用殘差和原來的塊就能推算出當前塊是什么樣兒的,這個過程叫運動補償(Motion Compensation)驼鞭。有全搜索秦驯,菱形搜索法,三步搜索算法挣棕,新三步搜索算法译隘,梯度下降搜索算法,運動矢量場自適應(yīng)搜索算法等各種算法洛心,這也一直是研究和發(fā)論文的熱點固耘。
四、幀分組 I幀词身,P幀厅目,B幀和GOP
對于視頻數(shù)據(jù)主要有兩類數(shù)據(jù)冗余,一類是時間上的數(shù)據(jù)冗余,另一類是空間上的數(shù)據(jù)冗余损敷。其中時間上的數(shù)據(jù)冗余是最大的户辫。下面我們就先來說說視頻數(shù)據(jù)時間上的冗余問題。
為什么說時間上的冗余是最大的呢嗤锉?假設(shè)攝像頭每秒抓取30幀,這30幀的數(shù)據(jù)大部分情況下都是相關(guān)聯(lián)的墓塌。也有可能不止30幀的的數(shù)據(jù)瘟忱,可能幾十幀,上百幀的數(shù)據(jù)都是關(guān)聯(lián)特別密切的苫幢。對于這些關(guān)聯(lián)特別密切的幀访诱,其實我們只需要保存一幀的數(shù)據(jù),其它幀都可以通過這一幀再按某種規(guī)則預(yù)測出來韩肝,所以說視頻數(shù)據(jù)在時間上的冗余是最多的触菜。
為了達到相關(guān)幀通過預(yù)測的方法來壓縮數(shù)據(jù),就需要將視頻幀進行分組哀峻。那么如何判定某些幀關(guān)系密切涡相,可以劃為一組呢?我們來看一下例子剩蟀,下面是捕獲的一組運動的臺球的視頻幀催蝗,臺球從右上角滾到了左下角。
H264編碼器會按順序育特,每次取出兩幅相鄰的幀進行宏塊比較丙号,計算兩幀的相似度。如下圖:
通過宏塊掃描與宏塊搜索可以發(fā)現(xiàn)這兩個幀的關(guān)聯(lián)度是非常高的缰冤。進而發(fā)現(xiàn)這一組幀的關(guān)聯(lián)度都是非常高的犬缨。因此,上面這幾幀就可以劃分為一組棉浸。其算法是:在相鄰幾幅圖像畫面中怀薛,一般有差別的像素只有10%以內(nèi)的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內(nèi)涮拗,我們認為這樣的圖可以分到一組乾戏。在這樣一組幀中,經(jīng)過編碼后三热,我們只保留第一帖的完整數(shù)據(jù)鼓择,其它幀都通過參考上一幀計算出來。我們稱第一幀為IDR/I幀就漾,其它幀我們稱為P/B幀呐能,這樣編碼后的數(shù)據(jù)幀組我們稱為GOP。
- I幀:關(guān)鍵幀,采用幀內(nèi)壓縮技術(shù)摆出。
- P幀:向前參考幀朗徊,在壓縮時,只參考前面已經(jīng)處理的幀偎漫。采用幀音壓縮技術(shù)爷恳。
- B幀:雙向參考幀,在壓縮時象踊,它即參考前而的幀温亲,又參考它后面的幀。采用幀間壓縮技術(shù)杯矩。
-
GOP:兩個I幀之間是一個圖像序列栈虚,在一個圖像序列中只有一個I幀。如下圖所示:
image.png