必要性與優勢
原始數字視頻數據量龐大,未經壓縮的視頻難以有效傳輸和存儲。例如,一個 1080p、30fps 的無壓縮視頻,每秒數據量可達數百兆比特。視頻壓縮的目標是在保證視覺質量的前提下,最大限度地減少數據冗余。視頻數據中存在多種冗余,包括:
- 空間冗余(Spatial Redundancy):圖像內部像素之間的相關性。
- 時間冗余(Temporal Redundancy):視頻序列中相鄰幀之間的相似性。
- 視覺冗余(Perceptual Redundancy):人眼對某些信息不敏感。
幀間壓縮主要針對時間冗余。與僅利用幀內空間冗余的幀內編碼(Intra-frame Coding)不同,幀間編碼通過利用視頻序列中幀與幀之間的相似性來顯著提高壓縮效率。其核心思想是,如果當前幀的某個區域與參考幀(Reference Frame)中的某個區域相似,則無需傳輸當前區域的全部信息,只需傳輸其與參考區域的差異(殘差)以及指示參考區域位置的信息(運動矢量)。這種方法可以極大地減少需要編碼的數據量。
H.264 在其前身標準(如 MPEG-2、H.263)的基礎上,對幀間預測技術進行了多項創新和改進,從而實現了更高的壓縮比和更好的圖像質量。
核心原理:預測與殘差編碼
H.264 幀間壓縮的基本流程可以概括為預測、殘差計算與編碼:
- 運動估計(Motion Estimation, ME):在當前待編碼的宏塊(Macroblock,H.264 中基本編碼單元,通常為 16x16 像素)中,在已編碼的參考幀中搜索最佳匹配塊。這個搜索過程會產生一個運動矢量(Motion Vector, MV),它指示了當前塊在參考幀中的位移。
- 運動補償(Motion Compensation, MC):根據運動矢量,從參考幀中提取預測塊。這個預測塊是對當前宏塊內容的估計。
- 殘差計算(Residual Calculation):將當前宏塊的原始像素值與運動補償得到的預測塊進行相減,得到殘差(Residual)。理想情況下,如果預測準確,殘差會非常小,甚至接近于零。
- 殘差編碼:對殘差進行變換(離散余弦變換,DCT)、量化和熵編碼。由于殘差通常能量集中且大部分值為零或接近零,因此可以被高效地編碼。
- 運動矢量編碼:對運動矢量進行預測和熵編碼。運動矢量通常具有空間和時間上的相關性,可以被有效壓縮。
- 解碼端重建:解碼器接收到運動矢量和殘差后,根據運動矢量從參考幀中提取預測塊,然后將預測塊與解碼后的殘差相加,即可重建出當前宏塊。
這個預測-殘差的循環過程是幀間壓縮的精髓,它將視頻編碼從直接編碼像素值轉換為編碼相對較小的殘差和運動信息。
幀間壓縮
多參考幀預測(Multiple Reference Pictures)
傳統的視頻編碼標準通常只允許使用一到兩幀作為參考幀(例如,MPEG-2 只能參考前一幀或后一幀)。H.264 顯著增強了這一能力,允許編碼器從一個多達 16 個已編碼幀的參考幀列表中選擇最佳的預測幀。
- 優勢:
- 提高預測準確性:當視頻內容發生復雜運動(如遮擋、揭示、快速切換)時,或者由于編碼幀率與拍攝幀率不匹配導致抖動時,多參考幀可以提供更多選擇,從而找到更接近當前塊的預測塊,有效降低殘差能量。
- 應對復雜的運動模式:對于非線性運動或周期性運動,多參考幀能更好地捕捉物體運動軌跡。
- 處理場景切換:即使在場景切換后,也可以從更早的幀中找到相似內容,避免不必要的 I 幀插入。
- 實現機制:編碼器維護一個參考幀列表,并通過對每個宏塊或子宏塊選擇一個列表中的參考幀和相應的運動矢量來進行預測。解碼器需要也維護同樣的參考幀列表來正確解碼。
可變塊大小運動補償(Variable Block Size Motion Compensation)
在 H.264 中,宏塊不再局限于單一的 16x16 像素塊,而是可以進一步細分為更小的子塊進行獨立的運動估計和補償。一個 16x16 的宏塊可以被劃分為:
- 16x16
- 16x8
- 8x16
- 8x8
而 8x8 的子塊還可以進一步遞歸地劃分為:
- 8x8
- 8x4
- 4x8
- 4x4
總共有 7 種不同的分區模式,每種模式都有其對應的運動矢量。
- 優勢:
- 更精細的運動表示:對于圖像中不同大小和形狀的運動物體,可以更精確地匹配其運動,減少殘差。例如,對于較大的平坦區域,使用 16x16 塊可以節省運動矢量比特;對于包含精細紋理或復雜運動的小區域,使用 4x4 塊可以提供更準確的預測。
- 提高編碼效率:通過為不同運動特性的區域選擇最合適的塊大小,可以最大程度地降低殘差能量,從而減少編碼比特數。
- 適應各種內容:無論是包含平滑運動的視頻(如人物對話),還是包含復雜細節和快速運動的視頻(如體育賽事),可變塊大小都能提供更好的適應性。
- 實現機制:編碼器在編碼一個宏塊時,會嘗試不同的分區模式,并根據率失真優化(Rate-Distortion Optimization, RDO)選擇最佳模式。解碼器通過解析宏塊頭中的分區信息來確定如何進行運動補償。
四分之一像素精度運動估計與補償(Quarter-Pixel Accuracy Motion Estimation and Compensation)
在 H.264 之前,運動補償的精度通常為半像素或整數像素。H.264 引入了四分之一像素(Quarter-Pixel)精度的運動估計和補償。這意味著運動矢量不再局限于整數像素坐標,而是可以指向四分之一像素位置。
- 優勢:
- 更準確的預測:通過亞像素插值,即使物體只移動了小于一個像素的距離,也能找到更精確的匹配,從而生成更小的殘差。這對于慢速運動和高清晰度視頻尤為重要。
- 降低殘差能量:更精細的預測意味著殘差圖像的能量更低,從而減少了編碼殘差所需的比特數,提高了壓縮效率。
- 實現機制:
- 插值濾波器:為了從整數像素位置生成亞像素位置的像素值,H.264 定義了特定的插值濾波器。對于半像素位置,使用 6 抽頭維納濾波器進行插值;對于四分之一像素位置,則通過對整數像素和半像素位置的線性插值獲得。
- 計算量增加:四分之一像素精度的運動估計和補償顯著增加了計算復雜性,但在性能提升方面帶來了巨大的回報。
加權預測(Weighted Prediction)
加權預測允許預測塊在與殘差相加之前,先進行加權和偏移處理。這對于處理亮度變化(如淡入淡出、閃爍)、交叉淡化或場景亮度變化的視頻內容非常有效。
- 優勢:
- 適應亮度變化:當視頻幀整體亮度發生變化時,傳統的運動補償會產生較大的殘差。加權預測通過調整預測塊的亮度和對比度,可以顯著減少這種場景下的殘差。
- 提高編碼效率:尤其在電影膠片數字化、視頻特技效果等場景中,加權預測能夠極大地降低編碼比特率,同時保持視覺質量。
- 實現機制:預測塊 P(x,y) 與當前塊 C(x,y) 之間的關系變為: P′(x,y)=weight×P(x,y)+offset 其中 P′(x,y) 是加權后的預測塊。編碼器會計算并傳輸 weight 和 offset 參數。
雙向預測(Bi-directional Prediction, B-frames)
H.264 沿用了 MPEG 標準中的 B 幀概念,并對其進行了增強。B 幀(Bi-predicted Picture)可以同時參考前面和后面的已編碼幀進行預測。
- 優勢:
- 更高的壓縮比:當一個物體在兩幀之間發生運動時,單向預測(P 幀)只能從一側進行預測。而雙向預測可以結合前后兩幀的信息,通常能找到更準確的匹配,從而生成更小的殘差。這使得 B 幀通常比 P 幀和 I 幀擁有更高的壓縮效率。
- 更靈活的參考列表:H.264 允許 B 幀使用兩個獨立的參考幀列表 (List 0 和 List 1),每個列表可以包含不同的參考幀,并且每個子塊可以獨立選擇使用 List 0、List 1 或兩者結合進行預測。這種靈活性進一步提升了 B 幀的預測能力。
- Direct Mode 預測:H.264 為 B 幀提供了一種特殊的 Direct 模式,可以根據相鄰宏塊的運動矢量和時間距離自動推導出當前宏塊的運動矢量,進一步節省了運動矢量的編碼比特。
- 實現機制:一個 B 幀的宏塊可以有以下幾種預測模式:
- List 0 預測:只使用 List 0 中的參考幀進行預測。
- List 1 預測:只使用 List 1 中的參考幀進行預測。
- 雙向預測:同時使用 List 0 和 List 1 中的參考幀進行預測,并對兩個預測塊進行加權平均。
運動矢量預測(Motion Vector Prediction, MVP)
運動矢量本身也需要編碼,而它們通常也存在冗余。H.264 利用運動矢量的空間和時間相關性進行預測。當前宏塊的運動矢量可以根據其相鄰宏塊(左側、上方、右上角)的運動矢量進行預測,也可以從時間上相鄰的宏塊進行預測。
- 優勢:
- 減少運動矢量比特數:通過預測,只需編碼運動矢量與預測值之間的差異(即運動矢量殘差),這通常比直接編碼完整的運動矢量要小得多,從而節省了大量比特。
- 提高編碼效率:運動矢量預測是 H.264 編碼效率提升的重要組成部分。
- 實現機制:編碼器根據預定義的規則,從相鄰已編碼宏塊中選擇一個或多個運動矢量作為候選預測值,并根據當前宏塊的運動選擇最佳預測值。
挑戰與優化
運動估計的計算復雜度
運動估計是幀間編碼中最耗時的部分。在多參考幀、可變塊大小和亞像素精度的情況下,搜索空間巨大。為了降低計算復雜度,通常采用以下策略:
- 分級搜索:先在大步長范圍內搜索,再逐步縮小搜索范圍。
- 快速算法:如菱形搜索、六邊形搜索、TSS (Three Step Search) 等,通過跳過不必要的搜索點來加速。
- 硬件加速:ASIC、FPGA 或 GPU 在并行計算方面具有優勢,可以加速運動估計。
參考幀管理
多參考幀雖然提高了預測精度,但需要維護和管理多個參考幀的緩存。H.264 引入了**參考幀管理(Reference Picture Management)機制,通過內存管理控制操作(Memory Management Control Operations, MMCO)**來指示解碼器如何處理參考幀。這包括:
- 短期參考幀:通常是最近解碼的幾幀,用于快速預測。
- 長期參考幀:可以是非連續的幀,用于某些特殊場景(如疊加層、長時間靜止背景)的預測。
- 滑動窗口模式:最常用的模式,新解碼的幀加入參考列表,最舊的幀被移除。
- 自適應內存管理:編碼器可以靈活地管理參考幀,以優化性能。
率失真優化(Rate-Distortion Optimization, RDO)
H.264 廣泛采用 RDO 來在編碼模式選擇中實現最佳的比特率和圖像質量平衡。對于幀間編碼,RDO 會評估不同的分區模式、運動矢量、參考幀選擇等,并選擇一個能夠最小化編碼比特數與圖像失真乘積的模式。
- 原理:最小化 J=D+λR,其中 D 是失真(如 SAD, SSE),R 是比特率,λ 是拉格朗日乘子,用于平衡比特率和失真。
- 應用:RDO 在宏塊級別、子宏塊級別甚至運動矢量預測級別上進行,確保每個決策都是最優的。
環路濾波(Loop Filter)
H.264 引入了去塊效應濾波(Deblocking Filter),該濾波器在編碼環路內部(即在重建圖像用于后續幀預測之前)應用。
- 目的:視頻編碼過程中,量化操作會導致塊邊界處出現明顯的塊效應(Blockiness),尤其是在低比特率下。去塊效應濾波器旨在平滑這些邊界,改善視覺質量。
- 優勢:
- 提高預測精度:經過濾波的圖像作為參考幀,可以為后續幀提供更平滑、更準確的預測源,從而減少殘差。
- 改善主觀視覺質量:顯著減少了畫面中的塊狀偽影,使視頻看起來更自然。
幀間編碼的類型:P 幀和 B 幀
H.264 中用于幀間壓縮的幀類型主要有兩種:
P 幀 (Predicted Picture)
P 幀是單向預測幀。它們只能參考前面的已編碼幀進行預測。一個 P 幀的宏塊可以是一個幀間編碼宏塊,也可以是一個幀內編碼宏塊(當預測效果不佳時)。
- 特點:
- 依賴于之前的幀。
- 壓縮效率高于 I 幀,低于 B 幀。
- 在視頻序列中扮演著承上啟下的角色。
B 幀 (Bi-predicted Picture)
B 幀是雙向預測幀。它們可以同時參考前面和后面的已編碼幀進行預測。由于雙向預測的靈活性和更高的預測精度,B 幀通常具有最高的壓縮效率。
- 特點:
- 依賴于之前和/或之后的幀,因此在解碼時需要對幀進行重新排序(Reordering)。
- 壓縮效率最高,可以顯著降低比特率。
- 引入了解碼延遲,因為需要等到后面的參考幀解碼后才能解碼 B 幀。
總結
H.264 的幀間壓縮技術是其成為高效視頻編碼標準的基石。通過引入多參考幀預測、可變塊大小運動補償、四分之一像素精度、加權預測、增強的雙向預測以及運動矢量預測等一系列創新,H.264 在其誕生之初就將視頻壓縮效率提升到了一個前所未有的水平。
這些技術的協同作用使得 H.264 能夠:
- 在相同視覺質量下,比 MPEG-2 節省 50% 以上的比特率。
- 適應各種復雜的視頻內容,從靜止場景到快速運動。
- 支持從標清到高清,甚至超高清的視頻分辨率。
H.264 幀間壓縮的成功,為后續的視頻編碼標準(如 H.265/HEVC 和 H.266/VVC)奠定了堅實的基礎,許多核心思想和技術創新在后繼標準中得到了進一步的演進和增強。例如,H.265/HEVC 將編碼單元從宏塊擴展到編碼樹單元(CTU),并引入了更靈活的分區結構和更復雜的運動補償,但其核心仍然是 H.264 所確立的幀間預測框架。