深入理解視訊編解碼技術----基於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
絕對誤差和
2)SATD
3)SSD
4)MAD
5)MSD
2.1.3.5 運動搜尋演算法
(1)全搜尋演算法
(2)快速搜尋演算法
三步法
二維對數法
交叉法
菱形法
2.1.4 運動補償
在運動估計的基礎之上,才能作運動補償,其實就是求運動向量的殘差
MVD為運動向量的殘差, 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值來預測該塊的運動向量,得到
(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優化的過程,即在給定的目標位元率下,選擇適當的量化引數使得失真最小。
具體的並沒看懂