《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看!

“紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼的形式操作一遍,才能對視訊壓縮編碼標準的思想和方法有足夠深刻的理解和體會!

GitHub程式碼地址:點選這裡

一、H.264的整數變換

變換和量化編碼在影象和視訊的壓縮編碼中具有重要作用。通過變換編碼,空間域資訊可以被轉換到頻率域,使其能量集中於低頻區域,並使其位元速率相對於空間訊號有大幅下降。H.264定義了4×4的整數離散餘弦變換(簡稱整數變換),相對浮點數的離散餘弦變換,整數變換具有更低的運算複雜度,更適用於移動裝置等適用於低功耗的裝置執行。

H.264的整數變換的主要流程如下圖所示:

標準的離散餘弦變換經過多重運算和修正後,可以用下式表示:

在上式中,右側的矩陣通常可以表示為常量矩陣,且併入量化中實現,左側的變換隻剩下加減和位移操作。通過這種方式構成了實際的整數變換操作。很明顯,相對於原始的DCT變換,該變換的運算量明顯要小得多。

二、量化

量化運算實際上並非視訊壓縮領域首先使用的。在通訊訊號處理等領域,量化技術早就獲得廣泛的應用。在模擬-數字訊號轉化過程中,首先需要對模擬訊號按照某個頻率進行取樣,獲得離散時間訊號,其取值範圍為一個連續區間。此時的離散時間訊號尚不能稱之為數字訊號。

為了對訊號進行數字化,必須對離散時間訊號進行量化,將連續的取值範圍區間也進行離散化。這樣的取值位置離散,取樣值也是離散的訊號稱之為數字訊號。

在一維訊號的量化過程中,我們就已經知道,對於同一模擬訊號,使用不同的引數進行量化的結果可能差別非常大,如下圖:

上圖的量化步長更小,因此失真明顯比量化步長更大的下圖更小。

在H.264中,量化方法選擇了運算較為簡單的標量量化。通常標量量化的原理為:

FQ = round(y/QStep)

在上式中,y表示待量化的原始數值,FQ為量化後的值,QP為量化引數。量化的相反過程稱之為反量化,其原理為:

y' = QStep × FQ

量化與反量化關鍵的因素在於量化引數QP。量化引數決定了量化步長,而量化步長決定了量化過程的精細度:QP越小,量化步長越小,量化過程中的真實資料損失越小。QP每增加6,量化步長增大一倍。在H.264中,通常亮度分量的QP取值範圍為[0,51],色度分量QP的取值範圍為[0,39]。

在H.264的量化過程中,還需要實現變換中的Ef矩陣按元素相乘的操作。量化和矩陣Ef的運算可通過與量化引數QP相關的預定義矩陣實現。

16×16模式與色度分量的變換量化

對於4×4模式的色度分量與16×16模式,其變換量化方法與4×4模式的亮度分量有些不同。

對於16×16的亮度塊,變換量化的塊包括兩個部分:直流部分DC和交流部分AC。16×16亮度塊的變換和量化依然要分為16個4×4個子塊實現,而與4×4模式不同的是,16×16模式首先抽取出16個4×4係數矩陣的直流分量,組成一個新的4×4矩陣,再對這個直流矩陣進行Hadamard變換後再進行量化。Hadamard變換的原理如下式:

對於4×4模式的色度分量,同樣需要抽取直流分量進行Hadamard變換然後再進行量化。然而色度分量的大小為8×8,每個分量分為4個4×4個子塊,因此Hadamard變換的直流分量矩陣為2×2大小: