1. 程式人生 > >深入理解視訊編解碼技術----基於H.264標準及參考模型 讀書筆記

深入理解視訊編解碼技術----基於H.264標準及參考模型 讀書筆記

書名: 《深入理解視訊編解碼技術—-基於H.264標準及參考模型》

第一章

1.各種變換,如DCT, 離散傅立葉變換等,是為了變換到另一個域中,便於對影象進行壓縮(如果加入預測,殘差值會更小一些,能夠讓編碼長度更短一些)

2.對在變換域中,能找到更多相關性,這樣在編碼的時候能夠更多的壓縮

離散餘弦變換DCT 經常把整數變換成浮點數 無法使用在無失真壓縮中 影象能量都集中在離散預先變換後的低頻部分
整數DCT變換 無失真壓縮

第二章

2.1 預測編碼

2.1.1

2.1.2 幀間預測編碼

2.1.3 運動估計

基於塊匹配的運動估計,就是找到幀和幀之間最相似的塊,記錄運動向量

2.1.3.1 運動估計的參考幀,前向後向及雙向預測

2.1.3.2 運動搜尋塊的大小

2.1.3.3 運動搜尋範圍

2.1.3.4 運動估計準則

1)SAD

絕對誤差和

SAD=(x,y)A|s[x,y]s2[x,y]|
2)SATD
3)SSD
4)MAD
5)MSD

2.1.3.5 運動搜尋演算法

(1)全搜尋演算法
(2)快速搜尋演算法
三步法
二維對數法
交叉法
菱形法

2.1.4 運動補償

在運動估計的基礎之上,才能作運動補償,其實就是求運動向量的殘差
MVD=MV

MVp
MVD為運動向量的殘差, MV為原來搜尋到的運動向量,MVp是通過周圍塊的MV預測得到的預測運動向量

2.4 編碼

2.4.7 指數哥倫布編碼

應用範圍:
除了DCT變換後的係數以外都用指數哥倫布編碼

h.264 使用0階指數哥倫布編碼
[M zeros][1][INFO]
ExpG依據變字長編碼理論。在變字長編碼中,編碼器的編碼輸出碼字是長度不等的碼字。大概率出現的資訊符號,賦以短字長的碼字;小概率出現的資訊符號,賦以長字長的碼字。所以要把對應數值對映到code_num的時候,就要遵循這個原則,概率大的對映到短字長的碼字,概率小的對映到長字長的碼字。
ExpG碼字的二進位制結構如下:


[前導零][1][INFO]
碼字包含 M個前導零(M>=0),
bit 1,
M-bit資訊域INFO。

根據輸入的引數code_num,
ExpG碼的編碼過程是:
M = floor(log2(code_num + 1))
INFO = code_num + 1 - 2^M

相應的,
解碼過程是:
(1) 讀取一系列連續的bit 0直到bit 1,記錄bit 0的個數(M)
(2) 讀取bit 1
(3) 讀取M-bit = INFO
(4) code_num = 2^M + INFO - 1
由此,ExpG的碼字長度是2M+1位元。

第三章

3.1 H.264常見術語解釋

3.1.1 基本名詞解釋

1)場和幀

2)巨集塊、片

一個編碼影象通常劃分成若干巨集塊組成,一個巨集塊由一個 16×16 亮度畫素和附加的一個 8×8 Cb和一個 8×8 Cr 彩色畫素塊組成。每個圖象中,若干巨集塊被排列成片的形式。
I 片 只包含I 巨集塊,P 片可包含 P 和I 巨集塊,而B 片可包含 B 和I 巨集塊。
I 巨集塊利用從當前片中已解碼的畫素作為參考進行幀內預測(不能取其它片中的已解碼畫素作為參考進行幀內預測)。
P 巨集塊 利用前面已編碼圖象作為參考圖象進行幀內預測,一個幀內編碼的巨集塊可進一步作巨集塊的
分割:即 16×16、 16×8、 8×16 或 8×8 亮度畫素塊(以及附帶的彩色畫素);如果選了 8×8 的子巨集塊,則可再分成各種子巨集塊的分割,其尺寸為 8×8、 8×4、 4×8 或 4×4 亮度畫素塊(以及附帶的彩色畫素)。
B 巨集塊 則利用雙向的參考圖象(當前和未來的已編碼圖象幀)進行幀內預測。

3.1.2 檔次(profile) 和 級(level)簡介

Baseline(基本)檔次(CAVLC)

Main(主要)檔次(CABAC)

Extended(擴充套件)檔次(CAVLC)

不同的檔次,支援的功能不一樣,熵編碼的方式也不一樣

3.2 H.264編解碼器框架


先得到殘差,然後再進行DCT變換、量化!!!

3.3 幀內預測

相鄰的附近的預測,包括亮度和色度

亮度:

預測模式

Intra4x4
Intra16x16

代價計算公式

Intra4x4 和 Intra16x16的代價計算公式不一樣

亮度最佳幀內預測模式的選擇有三個步驟

1.計算並得到代價最小的Intra4x4預測模式
2.計算並得到代價最小的Intra16x16預測模式
3.比較前兩步得到的代價,取其中代價較小的模式為最佳幀內預測模式

色度:

色度的最佳幀內預測模式的選擇只需要比較4種模式的代價,選擇代價最小的模式。

預測模式也可以通過旁邊塊來預測到,這樣可以較少對預測模式的編碼

幀內16x16預測的時候,要把DC係數抽取出來,組合成一個4x4塊,再經過Hardmard變換

3.4 幀間預測

3.4.1 樹狀結構分塊及運動估計

3.4.2 亞畫素插值

3.4.3 多參考幀預測

3.4.4 MV預測與SKIP模式

(1)MVp的獲取

用周圍MB塊的MV值來預測該塊的運動向量,得到MVp

(2)SKIP模式編碼

P_Skip型別巨集塊(H.264標準文件表7-13)

P_Skip型別巨集塊,也就是COPY巨集塊,既無運動向量殘差(MVD),也不編碼量化殘差,
解碼時,直接用MVp作為運動向量得到畫素預測值,畫素重構值等於畫素預測值
條件: MC得到的最終運動向量等於預測運動向量MVp,即運動向量差MVD為0,還有其餘條件,詳見書上

B_Skip型別巨集塊(H.264標準文件表7-14)

B_Skip型別巨集塊,也是既無運動向量殘差(MVD),又不編碼量化殘差,
解碼時,通過Direct預測模式計算出前、後向MV,利用前、後向MV得到畫素預測值,畫素重構之等於畫素預測值
條件: 變換系數要麼全被量化為0,要麼採用某種演算法被拋棄

3.4.5 B幀預測

3.4.6 加權預測

1) 亮度變化場景加權預測

幀間運動補償是基於視訊亮度不發生變化這樣一個假設,而在視訊尋列中,經常會遇到亮度變化的場景,加權預測的提出是為了應對亮度變化的場景。

2) 編碼

亮度變化檢測 :直方圖,個灰度級差別的絕對和
計算加權係數 :計算參考幀和當前幀的而亮度均值的桌布,利用該桌布作為加權係數; 或 MSE最小的加權係數和偏移量的計算加權係數
亮度補償

運動估計 在搜尋窗的範圍內進行搜尋,而不是整個幀影象範圍
運動補償等等

3.2熵編碼

CAVLC
應用範圍:
在 H.264標準的基本檔次中 ,亮度塊和色度塊的殘差資料是用 CAVLC 進行編碼的,即DCT變換後的資料是CAVLC編碼的。
**(
殘差資料在經過變換和量化後,非零係數主要集中在低頻部分;高頻部分的係數則大多數為零,非零係數的值也比較小,一般都是± 1。 CALVC充分利用了殘差資料的這一特性,設計了相應的編碼規則,減少了塊資訊的冗餘度。
)**
在h.263 MPEG-4中用的比較多

大體思想是拆分
拆分成 非零係數 、 拖尾係數 和 0;
拖尾係數不超過3個而且和非零係數有重疊,拖尾係數只有1 和 -1,可以用0和1來代表正負來編碼;
非零係數知道幅值即可;
剩下的都是0,只要記錄位置即可
1)把一個4x4係數矩陣,通過zigzag的方式掃描後, 重新排序
2)對非零係數的數目(TotalCoeffs) 以及 拖尾係數(TrailingOnes)的數目進行編碼
3)對每個拖尾係數的符號進行編碼,標準規定用0表示“+”號,1表示“-”號。編碼的順序是按照反向掃描的順序,從高頻資料開始。
4)對最後一個非零係數前零的數目(TotalZeros)進行編碼。
5)對每個非零係數前零的個數(RunBefore)進行編碼。還有一個變數ZerosLeft表示當前非零係數左邊的所有零的個數,ZerosLeft的初始值等於TotalZeros,在每個非零係數的RunBefore值編碼後進行更新。
注意在一下兩種情況下是不需要編碼的:最後一個非零係數(run_before[0])前零的個數;沒有剩餘的零需要編碼(ZerosLeft = 0)
CABAC 並沒有看懂

3.7 去塊效應濾波器

3.7.1 塊效應及其產生原因

3.7.2 後置濾波 與 環路濾波

3.7.3 濾波過程

1)計算邊界強度BS

2)區分真假邊界,假邊界即由塊處理造成的邊界需要進行去塊效應濾波

3.7.4 濾波運算

根據邊界強度BS的不同,採用不同強度的濾波

3.9 SP 與 SI幀技術

3.9.1 引入

3.9.2 應用

1)流間切換 如視訊清晰度切換
2)拼接與隨機接入 如在視訊播放中間插入廣告等造成的瞬時場景變化
當流的內容相同,只是影象質量不同時,可用SP技術;當流的內容相差很大時,使用SI幀技術將更有效
3)錯誤恢復

3.9.3 原理 沒看懂原理

用不同的幀能推匯出後面相同的幀,很奇怪的事情,沒看懂原理

舉例 :從 480p 切換到 720p
720p的SP主幀在編碼,跟平常一樣,其重建值標為720p重建值
720p的SP輔幀編碼的時候,輸出的
殘差 = 720p重建值 - 480p -> 720p預測值,其中480p預測值指的是從480p流中預測得到的720p的值
所以傳送殘差以後,可以根據前一幀的480p影象做參考,得到預測值,加上殘差,可以得到720p的重建值,即解碼得到SP輔幀

我的理解
就是在480p視訊流中(480p的殘差)
插入了720p的視訊(720p-480p的殘差),可以從480p視訊幀預測出720p視訊幀,然後加上
這個跨解析度的殘差,可以解出720p視訊幀

3.10 位元速率控制

3.10.1 基本原理

位元速率控制的總體目標是控制每一幀影象編碼輸出的位元數,並在總位元數一定的約束條件下使得影象失真最小,並且保證編解碼端的快取區不發生溢位。也就是說,典型的位元速率控制過程是一個率失真RDO優化的過程,即在給定的目標位元率下,選擇適當的量化引數使得失真最小。
具體的並沒看懂

3.11 模式選擇與率失真優化(RDO)

3.12 H.264的傳輸與儲存 涉及到NAL網路部分居多,這個暫時不用過多的糾結

3.13 H.264的差錯控制與錯誤隱藏 沒看懂,先不深究了