影片壓縮技術簡介

luckylan發表於2024-05-06

H264壓縮技術

H264的基本原理其實非常簡單,我們就簡單的描述一下H264壓縮資料的過程。透過攝像頭採集到的影片幀(按每秒 30 幀算),被送到 H264 編碼器的緩衝區中。編碼器先要為每一幅圖片劃分宏塊。

H264採用的核心演算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的演算法,幀間壓縮是生成B幀和P幀的演算法。

幀內(Intraframe)壓縮也稱為空間壓縮(Spatialcompression)。當壓縮一幀影像時,僅考慮本幀的資料而不考慮相鄰幀之間的冗餘資訊,這實際上與靜態影像壓縮類似。幀內一般採用有失真壓縮演算法,由於幀內壓縮是編碼一個完整的影像,所以可以獨立的解碼、顯示。幀內壓縮一般達不到很高的壓縮,跟編碼jpeg差不多。

幀間(Interframe)壓縮的原理是:相鄰幾幀的資料有很大的相關性,或者說前後兩幀資訊變化很小的特點。也即連續的影片其相鄰幀之間具有冗餘資訊,根據這一特性,壓縮相鄰幀之間的冗餘量就可以進一步提高壓縮量,減小壓縮比。幀間壓縮也稱為時間壓縮(Temporalcompression),它透過比較時間軸上不同幀之間的資料進行壓縮。幀間壓縮一般是無損的。幀差值(Framedifferencing)演算法是一種典型的時間壓縮法,它透過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少資料量。

壓縮方式說明

Step1:分組,也就是將一系列變換不大的影像歸為一個組,也就是一個序列,也可以叫GOP(畫面組);

Step2:定義幀,將每組的影像幀歸分為I幀、P幀和B幀三種型別;

Step3:預測幀, 以I幀做為基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;

Step4:資料傳輸, 最後將I幀資料與預測的差值資訊進行儲存和傳輸。

  • 劃分宏塊

H264預設是使用 16X16 大小的區域作為一個宏塊,也可以劃分成 8X8 大小。

劃分好宏塊後,計算宏塊的象素值。

影片壓縮技術簡介

以此類推,計算一幅影像中每個宏塊的畫素值,所有宏塊都處理完後如下面的樣子。

影片壓縮技術簡介

劃分子塊

H264對比較平坦的影像使用 16X16 大小的宏塊。但為了更高的壓縮率,還可以在 16X16 的宏塊上更劃分出更小的子塊。子塊的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的靈活。

影片壓縮技術簡介

上幅圖中,紅框內的 16X16 宏塊中大部分是藍色背景,而三隻鷹的部分影像被劃在了該宏塊內,為了更好的處理三隻鷹的部分影像,H264就在 16X16 的宏塊內又劃分出了多個子塊。

影片壓縮技術簡介

這樣再經過幀內壓縮,可以得到更高效的資料。下圖是分別使用mpeg-2和H264對上面宏塊進行壓縮後的結果。其中左半部分為MPEG-2子塊劃分後壓縮的結果,右半部分為H264的子塊劃壓縮後的結果,可以看出H264的劃分方法更具優勢。

影片壓縮技術簡介

宏塊劃分好後,就可以對H264編碼器快取中的所有圖片進行分組了。

幀分組

對於影片資料主要有兩類資料冗餘,一類是時間上的資料冗餘,另一類是空間上的資料冗餘。其中時間上的資料冗餘是最大的。下面我們就先來說說影片資料時間上的冗餘問題。

為什麼說時間上的冗餘是最大的呢?假設攝像頭每秒抓取30幀,這30幀的資料大部分情況下都是相關聯的。也有可能不止30幀的的資料,可能幾十幀,上百幀的資料都是關聯特別密切的。

對於這些關聯特別密切的幀,其實我們只需要儲存一幀的資料,其它幀都可以透過這一幀再按某種規則預測出來,所以說影片資料在時間上的冗餘是最多的。

為了達到相關幀透過預測的方法來壓縮資料,就需要將影片幀進行分組。那麼如何判定某些幀關係密切,可以劃為一組呢?我們來看一下例子,下面是捕獲的一組運動的檯球的影片幀,檯球從右上角滾到了左下角。

影片壓縮技術簡介
影片壓縮技術簡介

H264編碼器會按順序,每次取出兩幅相鄰的幀進行宏塊比較,計算兩幀的相似度。如下圖:

影片壓縮技術簡介

透過宏塊掃描與宏塊搜尋可以發現這兩個幀的關聯度是非常高的。進而發現這一組幀的關聯度都是非常高的。因此,上面這幾幀就可以劃分為一組。其演算法是:在相鄰幾幅影像畫面中,一般有差別的畫素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內,我們認為這樣的圖可以分到一組。

在這樣一組幀中,經過編碼後,我們只保留第一帖的完整資料,其它幀都透過參考上一幀計算出來。我們稱第一幀為IDR/I幀,其它幀我們稱為P/B幀,這樣編碼後的資料幀組我們稱為GOP。

運動估計與補償

在H264編碼器中將幀分組後,就要計算幀組內物體的運動向量了。還以上面運動的檯球影片幀為例,我們來看一下它是如何計算運動向量的。

H264編碼器首先按順序從緩衝區頭部取出兩幀影片資料,然後進行宏塊掃描。當發現其中一幅圖片中有物體時,就在另一幅圖的鄰近位置(搜尋視窗中)進行搜尋。如果此時在另一幅圖中找到該物體,那麼就可以計算出物體的運動向量了。下面這幅圖就是搜尋後的檯球移動的位置。

影片壓縮技術簡介

透過上圖中臺球位置相差,就可以計算出臺圖執行的方向和距離。H264依次把每一幀中球移動的距離和方向都記錄下來就成了下面的樣子。

影片壓縮技術簡介

運動向量計算出來後,將相同部分(也就是綠色部分)減去,就得到了補償資料。我們最終只需要將補償資料進行壓縮儲存,以後在解碼時就可以恢復原圖了。壓縮補償後的資料只需要記錄很少的一點資料。如下所示:

影片壓縮技術簡介

我們把運動向量與補償稱為幀間壓縮技術,它解決的是影片幀在時間上的資料冗餘。除了幀間壓縮,幀內也要進行資料壓縮,幀內資料壓縮解決的是空間上的資料冗餘。下面我們就來介紹一下幀內壓縮技術。

幀內預測

人眼對圖象都有一個識別度,對低頻的亮度很敏感,對高頻的亮度不太敏感。所以基於一些研究,可以將一幅影像中人眼不敏感的資料去除掉。這樣就提出了幀內預測技術。

H264的幀內壓縮與JPEG很相似。一幅影像被劃分好宏塊後,對每個宏塊可以進行 9 種模式的預測。找出與原圖最接近的一種預測模式。

影片壓縮技術簡介

下面這幅圖是對整幅圖中的每個宏塊進行預測的過程。

影片壓縮技術簡介

幀內預測後的影像與原始影像的對比如下:

影片壓縮技術簡介

然後,將原始影像與幀內預測後的影像相減得殘差值。

影片壓縮技術簡介

再將我們之前得到的預測模式資訊一起儲存起來,這樣我們就可以在解碼時恢復原圖了。效果如下:

影片壓縮技術簡介

經過幀內與幀間的壓縮後,雖然資料有大幅減少,但還有最佳化的空間。

對殘差資料做DCT

可以將殘差資料做整數離散餘弦變換,去掉資料的相關性,進一步壓縮資料。如下圖所示,左側為原資料的宏塊,右側為計算出的殘差資料的宏塊。

影片壓縮技術簡介

將殘差資料宏塊數字化後如下圖所示:

影片壓縮技術簡介

將殘差資料宏塊進行 DCT 轉換。

影片壓縮技術簡介

去掉相關聯的資料後,我們可以看出資料被進一步壓縮了。

影片壓縮技術簡介

做完 DCT 後,還不夠,還要進行 CABAC 進行無失真壓縮。

CABAC

上面的幀內壓縮是屬於有失真壓縮技術。也就是說影像被壓縮後,無法完全復原。而CABAC屬於無失真壓縮技術。

無失真壓縮技術大家最熟悉的可能就是哈夫曼編碼了,給高頻的詞一個短碼,給低頻詞一個長碼從而達到資料壓縮的目的。MPEG-2中使用的VLC就是這種演算法,我們以 A-Z 作為例子,A屬於高頻資料,Z屬於低頻資料。看看它是如何做的。

影片壓縮技術簡介

CABAC也是給高頻資料短碼,給低頻資料長碼。同時還會根據上下文相關性進行壓縮,這種方式又比VLC高效很多。其效果如下:

影片壓縮技術簡介

現在將 A-Z 換成影片幀,它就成了下面的樣子。

影片壓縮技術簡介

從上面這張圖中明顯可以看出採用 CACBA 的無失真壓縮方案要比 VLC 高效的多。

小結

至此,我們就將H264的編碼原理講完了。本篇文章主要講了以下以點內容:
1. 簡音介紹了H264中的一些基本概念。如I/P/B幀, GOP。
2. 詳細講解了H264編碼的基本原理,包括:

  • 宏塊的劃分
  • 影像分組
  • 幀內壓縮技術原理
  • 幀間壓縮技術原理。
  • DCT
  • CABAC壓縮原理。

相關文章