FFmpeg 之I B P幀的基本編碼原理(三)

2021-09-30 00:23:33 字數 1839 閱讀 8623

上篇說過,mpeg-1主要在時間冗餘和空間冗餘兩個方向上,去除冗餘資料。時間冗餘是幀與幀之間產生的冗餘資料,而空間冗餘則是單幀影象中,相鄰畫素間產生的冗餘資料。對於i幀來說,因為它是關鍵幀,既不需要參考過去的幀,也不需要參考將來的幀。所以對i幀的編碼,是為了消除空間冗餘資料,而且它採用的壓縮演算法,和jpeg類似。如下圖:

i幀的壓縮編碼演算法

從圖中可以看到,如果影象是用rgb顏色空間表示的,則首先把它轉換成用ycbcr空間表示的影象。然後每個影象平面分成8x8畫素的圖塊,並對每個圖塊進行離散余弦變換(dct)。

這裡dct的作用非常大,看它的名字可能會覺得非常高大上,其實它就是乙個矩陣變換。關於它其實都可以專門寫一篇文章出來,不過這裡我們只需要知道它的作用即可。dct簡單點來說,它就是將前面8x8畫素圖塊的顏色空間資料,分為高頻資料和低頻資料,所以我們也常說,dct是把資料從空間域轉換到頻率域。

那什麼是高頻和低頻呢?這裡的高頻資料是指,影象顏色的變化比較強烈的地方,比如人像畫的輪廓與背景的交叉處,在這裡的色值變化很快,所以稱為高頻。相對的低頻就是指,顏色變化比較緩和的地方。所以dct的作用並不是對資料進行壓縮,而是為了方便後面的操作,比如量化、rle行程編碼、以及霍夫曼編碼。

下一步就是量化,因為人眼對高頻區域其實並不敏感,所以利用這一點,可以將高頻部分資料進行壓縮。這樣一來,圖塊的資料就會呈現兩部分,一部分是變化平滑的低頻資料,另一部分是剛壓縮過的高頻部分,數值也變得差不多。而後再經過zig-zig編排,資料就會呈現出連續幾個值相同的的形式,比如23334551550000。這樣一來,再經過rle行程編碼,就可以去掉連續值相同的冗餘資料。

因為rle在編碼時,對相同的數值只編碼一次,同時計算相同數值重複的次數,因此稱為行程編碼。而與rle處於同級的dpcm,則主要是對圖塊與圖塊之間的差值進行編碼。這樣一來可以再次壓縮資料,之後再通過霍夫曼編碼或者算術編碼,編碼操作也就完成了。同樣霍夫曼編碼和算術編碼,也可以單獨寫一篇文章出來。

p幀也就是**影象p,與i幀不同的是,它不僅要從空間上去除冗餘資料,還要從時間冗餘方面上著手,因為它是以在它之前出現的i幀作為參考物件來編碼的。與i幀不同的是,**影象p的編碼是以16x16畫素的巨集塊為基本編碼單元的。對於p幀,為了表示它與前面i幀的關係,我們會一直用**影象和參考影象這兩個詞。

比如下圖:

這張圖應該一目了然,時刻1中的人像,在時刻2移動到了影象右側。這個過程中變化的,不只是人像的位置,因為人在移動的時候,會有其他的動作,比如低頭、轉頭、仰頭等動作。所以我們並不僅僅要計算出人像變化之後的位置,也就是移動向量,還要計算出兩個巨集塊之間的差值。

當然這兩者在編碼過程中,是有個先後關係的。比如我要計算出巨集塊的移動向量,那我得找到參考影象中的巨集塊,在**影象中的位置吧。而更進一步,那我怎麼找到**影象相對於參考影象中,圖塊的位置呢?答案是**影象中的某個巨集塊,與參考影象中的這個巨集塊的差值最小,也即最佳匹配巨集塊。

這就引起了一系列的搜尋演算法,去**影象中去找這個巨集塊,比如二維對數搜尋法、三步搜尋法、對偶搜尋法。而對**影象p的編碼所引起的時間,則主要是執行這個搜尋演算法所占用的時間。

等找到最佳匹配巨集塊後,計算出差值和移動向量,剩下的操作就和對i幀的編碼一致了。

**影象p的壓縮編碼演算法

b幀也是雙向**影象b,對它的編碼,即是對它前後幀的畫素值之差進行編碼,具體的方法和對**影象p的演算法類似。

雙向**影象b的壓縮編碼演算法

IBP幀的介紹

幀 就是影像動畫中最小單位的單幅影像畫面,相當於電影膠片上的每一格鏡頭。而在實際壓縮時,會採取各種 演算法減少資料的容量,其中 ipb 就是最常見的。1 基本概念經過適度地壓縮,做為隨機訪問的參考點,可以當成圖象。i 幀可以看成是乙個影象經過壓縮後的產物。p frame 前 向 編碼幀 又稱 pre...

MPEG壓縮中的 I B P幀

首先,mpeg 1壓縮的基本思想 幀內壓縮和幀間壓縮。其次,時間相關性的統計分析 統計的結果表明,在間隔1 2幀的影象中,各畫素只有10 以下的點,其亮度差值變化超過2 而色度差值的變化只有1 以下。採用的壓縮方法 分組 把幾幀影象分為一組 gop 為防止運動變化,幀數不宜取多。1.定義幀 將每組內...

ffmpeg的基本使用方法

概述 ffmpeg的官方介紹如下 a complete,cross platform solution to record,convert and stream audio and video.輸入與輸出可以是乙個或多個。處理流程示意圖 以下內容主要是學習了ffmpeg基礎使用後結合自己的實踐,做的...