一、H264編碼模型
如圖,關注前向的編碼路徑。理解H264的碼率控制,首先要理解編碼中的預測和量化。
1.1 預測模式
編碼傳輸的是當前幀和預測幀之間的差值。預測幀可以通過幀內 或者幀間的預測的方式得到。幀內或者幀間具體如何來得到預測幀 ,就有相應的預測模式。(如預測幀某個8X8可通過編碼重構後的幀上下或者左右的8X8的塊得到)。採用編碼重構後的幀是因爲解碼端也是通過殘差來進行重構解碼圖像的。
預測模式有很多種,不同的預測模式會有不同的失真?如何決定使用哪種預測模式?預測模式選擇方法:
爲了能夠保證在獲得儘可能好的編碼質量的同時將編碼後的數據比特降至最小,採用的RDO(率失真優化)。 這裏QP是已知的,通過RD模型來決策用哪種預測模式。其中預測編碼失真是通過預測塊和原始塊差值的平方和來度量的。
步驟:選擇RDO爲代價函數,對每種預測模式計算RDO,選擇RDO最小的。
其中
在可選模式中選擇最佳的模式,使得在限定碼率 Rc下,失真 D 最小。
具體對於亮度分量來說,幀內預測可分爲 4×4 亮度子塊預測或 16×l6宏塊預測,其中 4×4 亮度子塊有 9 種可選的預測模式,它適用於帶有大量細節的圖像碼;16×l6 亮度塊有 4 種可選方式,它適用於平坦區域圖像編碼。如何決定使用哪種大小宏塊。
首先計算一個16x16塊 4種預測模式的Cost,然後選擇最小的。在把這16x16塊分成16個4x4塊,計算每個4x4塊9種預測模式的最小,將所有16個最小值加起來 。如果分塊的Cost小的那採用4X4分塊的方式,否則用16X16大塊的方式。
1.2 量化步長
量化是多對一的映射,目的是降低比特率。量化過程的量化步長是一個很關鍵的參數,決定了編碼輸出的比特率。實際上,QP 反映了空間細節壓縮情況,QP 小,則大部分的細節都會被保留;QP 增大,一些細節丟失,碼率降低,但圖像失真加強和質量下降。也就是說,QP 和比特率成反比的關係,而且隨着視頻源複雜度的提高,這種反比關係會更明顯。如何確認這個參數? 同樣也是利用RD模型來求解的。
二、 碼率控制
2.1 碼率控制意義:
場景的簡單,複雜, 不同幀之間編出來的比特數差距大,帶寬利用率不均,有時發的數據多,有時發的少。帶寬有限,爲了充分利用帶寬,採用碼率控制來保持輸出碼率接近目標碼率。所以視頻編碼的實際應用中,需要在編碼器上應用碼率控制算法,生成碼率相對恆定和可控的原始碼流,從而在經過其後的多道傳輸步序後,保證最終實時信源解碼的播放效果。
2.2 碼率控制模型
碼率控制器負責收集碼率、延時和緩衝區狀態信息並調節編碼參數,使得性能指標維持在給定水平上。緩衝區起平滑碼率波動的作用。在編碼端,數據輸入緩衝區的碼率是變化的,而輸出碼率則取決於碼率控制的模式。碼率控制算法先根據目前帶寬的要求和緩衝區剩餘空間的大小爲每一個將要編碼的圖片分配一定量的比特數,然後再爲圖片中每一個編碼宏塊也分配一定量的比特數,接着再根據每個宏塊所分配的比特數來調整編碼器中的宏塊編碼參數,然後編碼器可以根據新的編碼參數爲該宏塊編碼,使得編碼完的比特數能夠近似等於碼率控制算法爲此宏塊分配的比特數。
2.3碼率控制中的關鍵技術
率失真理論:
描述編碼失真度和編碼數據速率的關係 R-D模型
信源模型:
信源模型描述了碼率、失真、量化步長以及其它狀態之間關係。它的準確性
關係到編碼器能否在給定的失真和碼率條件下對編碼比特數作出正確的預測。
H264使用的經驗模型:
二階拋物模型
X1,X2爲模型參數,S爲用 SAD (絕對誤差和)表示的編碼複雜度
2.4 H264的碼率控制
存在的問題:
預測模式判決需要用到QP, 但是QP值只有碼率控制完之後才知道,而碼率控制要能夠進行,就需要知道 MAD (宏塊的失真,平均絕對差值)。MAD只有在預測模式知道後才能求得。
需要解決的問題:
1、應該給每個GOP, 幀和MB分配多少的碼率?
2、MB的MAD怎麼估計?
2.3.1 當前編碼幀的目標比特數
流量往返模型用於計算當前編碼幀的目標比特率。
初始時 緩衝區大小爲0,第一個GOP 第一幀編出來的比特數 減去 編碼時長內已經發送了多少數據。(幀率分之1,表示一幀多長時間 * 帶寬(bit/s)), 就是佔用了緩衝區的大小,後面每一幀佔用緩衝區大小 = 前一幀編碼後佔用緩衝區大小+ 編碼出來的比特數 - 通過信道已經發送出去的比特數。
2.3.2 MB的MAD的估計
後一幀的MAD根據前一幀的對應位置處的MAD來更新
2.3.3 假想參考解碼器
標準的好處在於保證所有符合標準的解碼器能夠解碼出一致的視頻質量。要實現標準,僅僅提供編碼算法的描述是不夠的,在實時系統中,指定如何饋送碼流比特給解碼器,解碼的圖像如何移出解碼器等都是很重要的。要實現該功能,必須指定輸入/出緩衝器模型和開發與實現無關的接收機模型。這樣的接收機模型稱爲假想參考模型(HRD)。編碼器不允許產生假想參考模型不能解碼的位流。因此如果所有接收機都模擬假想參考模型的行爲,可以保證所有解碼器解出的碼流具有很好的一致性。
目標比特數的上下限
A(n):表示第i個gop中第J-1幀生成的比特數。HRD目的是限制目標比特率的上下限, 防止緩衝區上溢和下溢。
2.5、H264碼率控制的基本步驟
1. 根據流體流量模型計算當前幀的目標比特率;
2. 將剩餘比特平均分配到當前幀中所有未編碼基本單元;
3. 根據前一幀中對應位置處基本單元的實際 MAD 值,用線性 MAD 預測模型來預測當前幀中當前基本單元的 MAD;
4. 利用二次 R-D 模型計算相應參數(QP);
5. 用步驟 4 中得到的 QP 對當前基本單元中每個 MB 進行 RDO。
可以分爲三個層次進行碼率控制
GOP層碼率控制, 幀層碼率控制, 基本單元層(可能包含一個或多個宏塊 使用同一個量化參數)碼率控制。
總體框架圖如下:
從GOP層開始,GOP層的任務分配每個GOP的目標比特數和每個GOP起始I幀和P幀的QP值。 深入到GOP中,對GOP中的每一幀進行幀層碼率控制,幀層的任務是計算每幀的目標比特數,求每幀的量化參數,根據B幀和P幀的不同,求取的方式不同。當一幀還有多個BU時,需要進行BU層的碼率控制,同樣也是計算BU的目標比特數和QP。GOP層決定了整個GOP層分配多少比特,而幀層的比特分配依賴於GOP成的比特分配,基本單元層的的比特分配則由幀層比特分配決定的。一層一層往下分配比特,同樣編碼完成後實際編碼比特數也一層一層向上累積反應到GOP中的緩衝區。
2.6 GOP層的碼率控制
目的:總的GOP比特率分配, 起始的QP(GOP中第一個I幀和P幀的QP)確認。
其中A(n):表示第i個gop中第J-1幀編碼生成的比特數。
這個公式表示的是 分配給當前GOP的比特總數 爲 當前GOP中的總幀數的時間內信道能夠發送多少數據+ 上個GOP編碼完成後緩衝區還剩下的大小 - 當前GOP編碼完成後緩衝區應該還剩下的大小。
起始的QP確認:
分爲兩種情況,第一個GOP 和 非第一個GOP。
第一個GOP的I 幀和P幀用QP0進行編碼,QP0大小取決於帶寬和GOP的長度。原則是:可用帶寬高的時候,QP0就取得大一點,否則就小一點。相同帶寬,GOP長度越長,那麼QP0要減小。
其他非第一個GOP的起始QP通過下式計算
2.7 幀層碼率控制
分爲兩個階段 預編碼和後編碼,預編碼的任務是求GOP中所有幀的QP值,後編碼階段根據預編碼階段求的QP,預測模式進行編碼,用編碼後的幀和原始幀來更新預編碼階段使用模型的參數。
預編碼階段:首先B幀的量化參數
B幀一般不用於參考,使用的量化一般比較大,這裏直接由前後的p幀來決定。具體參考
最終還有微調
P幀量化參數:
1、確定每個P幀的目標比特數
分爲兩個層次進行控制 利用目標緩衝區佔用量來調節目標比特數。計算圖像分配的比特需要考慮當前緩衝區的佔用量和圖像的複雜度。
宏觀控制:
在幀層碼率控制的時候 已經知道GOP中第一個P幀的QP值,那麼目標緩衝級初始值就爲第i個Gop中第一個P幀編碼完成之緩衝區的實際佔有度。
後續P幀目標緩衝級別的更新:
沒有B幀時(即L爲0),可以簡化爲
公式意義??:
微觀控制:
第i個GOP中第j幀的目標比特數:
剩餘比特的表達式:
最終的目標比特數是計算得到的目標比特數 和 剩餘比特數的加權:
2、利用線性預測模型得到MAD計算P的QP值。
求MAD:
求QP:
由步驟1知道當前P幀分配的比特數,由線性模型知道MAD,X1, X2已知,求解
QP值。求出QP值後要進行調整。
最後,爲了保證圖像的視覺平滑性,要儘量避免相鄰幀之間的量化參數激增,用如下
公式對QPc 進行調整, QPp 表示前一個 P 幀的量化參數。
3、決策預測模式
將上一步求的的QP,分別對每種MODE求D。 取使D最小的那個預測模式。
後編碼階段:
在這一階段,知道了預測模式之後,就能夠得到預測的那幀圖像,QP值也已知。
那麼就可以通過編碼後的幀和原始幀來更新MAD預測模型的參數,更新二次RD模型的參數,並決定要跳過的幀數。
1、MAD預測模型參數的更新
原理:根據一組數據擬合出一條線性方程,使得擬合的數據偏差平方和最小的參數就是所求。
第一步一數據點選擇:數據點是用於更新模型參數,數據點的數量以及質量對於模型的準確性有着重要的影響。通常而言,數據點越多,模型越準確。在JM86模型中,採用滑動窗口機制進行數據點的選擇,窗口大小通常爲20。
第二步一計算模型參數:根據選中的數據點,算法收集預測的MAD和實際MAD的值,採用線性迴歸的方法,計算得到a1和a2。
第三步一去除壞的數據點:在得到al和a2之後,根據滑動窗口中數據點的參考值,用a1和a2形成的預測模型計算數據點的預測值,然後將得到的值與數據點的原始預測值比較,計算誤差,如果誤差大於一定的值(JM中取誤差的均值),則將該數據點去除,用更新後的數據點重新計算模型參數al和a2。
2、二次RD模型的X1,X2的更新也類似。
3、決定要跳過的幀數
在對一幀進行編碼後, 緩存級通過增加當前幀產生的總比特數並減去從緩存中移除的總比特數進行更新。如果更新的緩存級達到了緩存池的80%時候,編碼端將忽略即將到達的幀,直到緩存佔有量下降到安全界限以下。
2.8 基本單元層的碼率控制
基本單元層的作用: 爲幀中基本單元選擇量化參數,使得所有基本單元的編碼比特數之和與幀層計算的目標比特數接近。
在碼率控制方案中,I幀和B幀僅通過量化參數進行編碼,而基本單元層碼率控制則僅在幀P中使用。
1、計算當前基本單元層的目標比特數
P幀的目標比特率在幀層碼率控制的時候已經求得,剩餘比特數被等分給p幀中每個基本單元。如下
2、預測當前幀當前基本單元的MAD
通過MAD預測模型對當前幀當前單元的MAD進行預測,並計算當前基本單元的目標比特。
3、利用二次率失真模型求當前基本單元的QP。需要考慮以下三個情形
1、當前幀的第一個基本單元。將先前幀所有基本單元的QP平均值賦給當前單元的QP。
2、當前幀所有未編碼基本單元的剩餘比特數小於零的情況。在這種情況下, 當前單元的QP應該大於先前基本單元的QP值。
3、其他情況下,則通過使用二次率失真模型得到。
確定量化參數值後,在當前基本單元的所有宏塊執行RDO,然後更新當前幀剩餘比特數目和未編碼基本單元數目。
總結:
根據帶寬,緩衝區來爲編碼圖像分配一定的目標比特數,根據目標比特數和失真確定量化步長QP,由QP去求預測模式,求得預測模式,就可以知道實際的編碼比特。利用這個實際的編碼比特去更新緩衝區和下一幀分配的目標比特。QP小,編出來比特數多了,那麼下一幀就分配少了,下一幀QP相應會加大,讓編出來的比特率就少點。這樣一個動態調節的過程。