视频通信中的码率控制算法
碼率控制技術RC(Rate Control)是視頻編碼中一個非常重要的技術模塊。不同的應用場景對視頻編碼的碼率控制有不同的需求,離線編碼通常采用可變碼率(VBR),實時視頻系統通常采用恒定碼率(CBR)。本篇技術干貨將深度剖析視頻編碼中的碼率控制算法,分析其背后的數學模型及理論,希望能幫助大家更好地理解視頻通信中的碼率控制算法。
PART 01 碼率控制類型
碼率控制主要指編碼過程中,通過調整QP來控制視頻碼率的行為。在不同的使用場景下,用戶對視頻的碼率大小、穩定性會有不同的要求,因此碼率控制的類型也多種多樣。比如觀看離線視頻文件時,往往不需要此視頻具備恒定的碼率,因為整個文件都在本地,只要磁盤IO和設備解碼能力都合格,基本就不會發生卡頓問題(這里不討論硬件解碼的buffer限制以及內網NAS的帶寬限制)。所以壓制這類視頻時會傾向于保證質量而非碼率平穩性。畫面紋理比較復雜或運動劇烈的場景,碼率給高一些,以保證畫面質量;而畫面簡單的場景,碼率就給低一些,節省硬盤空間。這種碼率控制策略我們統稱為可變碼率(VBR)。
但在觀看在線視頻時,由于用戶帶寬是恒定的,能夠緩存的數據量也有限,所以需要對碼率做一些限制。否則一些瞬時碼率過高的片段可能會引起卡頓。此外還有一點,由于CDN是按流量計費的,視頻網站如果使用VBR編碼視頻會使帶寬成本變得不可控。所以壓制這類視頻時,會傾向于選擇恒定碼率(CBR)。
不同場景下的碼率控制需求
本文接下來的討論內容主要集中在CBR,但其中的一些改良算法其實也可以用在VBR。
PART 02 碼率控制根基:RQ模型
首先看一下碼率控制的大體流程:
碼率控制基本流程
可以看到整個流程都是圍繞著RQ模型進行。這里的RQ模型指的是碼率與QP的推導關系,可以說是碼率控制算法的根基。它經歷過多次改進,精度也在不斷提高,這里舉幾個例子:
一階模型:
最簡單的模型,在x264、OpenH264等編碼器中被廣泛使用。式中Q指Q-step,即量化步長。R指Rate,表示碼率。Comp表示圖像復雜度,一般可以使用MAD(Mean Absolute Difference)來計算。α是一個系數,需要我們在編碼過程中不斷根據實際輸出碼率來更新。
二階模型:
一階模型的進階版,JM中有使用。
R-λ模型:
在HM(HEVC Test Model)中被引入的模型[1],顯著提升了碼率控制精度。式中的λ是率失真優化中使用的拉格朗日乘子,放在下節作為拓展內容介紹。而f(λ)則是通過實驗擬合得到的。比如HM中就是:
PART 03 MAD值的獲取與模型的更新
上面提到圖像復雜度可以使用MAD來計算,但是當前幀的MAD值只能在編碼后才能得到。這與QP需要在編碼前確定這一點相矛盾。另外,在模型確定后,我們還需要確定模型的更新方式及速率。通過提高模型系數的更新速率,可以使編碼器的輸出碼率更加平穩;但相對的,畫面質量可能由于QP變化幅度過大而下降。
針對這些問題,不同的編碼器選擇了不同的方案:
在JM中,使用了一個一階線性模型根據過去幀的MAD來預測當前幀的對應值。而RQ模型的系數則直接通過當前幀的編碼結果來反向計算得到。
在OpenH264和x264中,則放棄了MAD的計算,轉而合并了
,把它作為一個整體來計算。
對于R-λ模型,其提出者也已經設計了對應的更新公式和經驗值供我們參考[1]。
模型更新這部分內容,更多是工程實踐上的考量,需要根據經驗和測試情況不斷調整。
拓展:λ是什么
R-λ模型中的λ是率失真優化中的一個系數。這里的率失真優化,指的是編碼過程中的一個優化步驟。要詳細解釋它,我們需要先了解率失真理論。它起源于香農的研究[2],大致可以概括為:在給定的信源分布以及可接受的失真度D下,求信息數據量R的理論最小值。顯然,可接受的D越大,其對應的R也就越小。這個R-D的關系邊界,我們稱為率失真曲線,即下圖中的紅線[3]。旁邊的綠線則是編碼器實際工作區域的邊界,它和理論值存在一定差距。
R-D曲線
視頻編碼標準提供了大量的工具集,或者說編碼模式,它們就相當于上圖的綠點。在它們之中選擇一個恰當的來使用是一件比較復雜的事情。注意到這個問題本質是一個數學最優化問題,所以可以利用拉格朗日乘數法的離散形式來解決它。簡單地說,引入一個拉格朗日乘子λ,構建代價函數,再去求取代價函數的最小值即可:
通俗地理解,λ就相當于失真與碼率的權值。給定了λ,也就給定了一個判定模式好壞的標準。如下圖所示,求代價函數最小值,相當于求斜率為λ的直線與R-D曲線的切點。在編碼過程中,不論是模式選擇,還是運動矢量的比較,都會利用到這個方法。
拉格朗日乘子R-D曲線斜率R-λ模型的提出者首先根據實驗數據提出R-D曲線可以近似擬合為一條雙曲線,再根據λ是R-D曲線斜率這一點,求得了R-λ模型:
PART 04 碼率控制優化算法
上文介紹的內容,屬于碼率控制核心算法,其目的僅為控制輸出碼率,使其盡可能地接近目標。但在實際應用中,我們并不需要這么嚴格地執行。在輸出碼率基本滿足要求的前提下,我們依然有一定的調整空間來改善畫面質量。下文將介紹幾種這方面的算法。
Adaptive-Quantization
由于人眼對不同類型的畫面的細節感知程度是不同的,所以給不同畫面內容給予相同的權重來分配碼率實際上是比較浪費的。比如高速運動的物體就可以相對靜態物體模糊一點。在這方面做文章的算法一般歸類為基于感知的碼率控制算法。而其中一類比較簡單且使用廣泛的算法,叫做Adaptive Quantization(AQ)。簡單來說,它利用圖像的方差或其他類似特征來衡量當前宏塊的復雜度,對于內容較復雜的宏塊,算法認為可以適當舍棄其細節,所以增大其QP;而簡單的宏塊則反之。經過這種調整,視頻的主觀質量能得到大幅提升。如今很多編碼器都實現了AQ,比如x264的實現如下所示。計算得到的qp_adj即QP偏移量,會疊加到R-Q模型計算出來的QP上:
// x264的AQ核心實現。ac_energy_mb計算宏塊像素值方差。strength代表AQ強度,由用戶配置。 uint32_t energy = ac_energy_mb( h, mb_x, mb_y, frame ); qp_adj = strength * (x264_log2( X264_MAX(energy, 1) ) - (14.427f + 2*(BIT_DEPTH-8)));利用人眼感知能力的碼率控制算法還有很多,比如基于最小可覺察誤差(JND, Just Noticeable Distortion)的,或者基于機器學習的,這里不再展開。值得一提的是,由于是針對主觀視覺體驗的優化算法,通過PSNR等客觀手段測試往往無法體現這些算法的優勢。
MB-Tree
MB-Tree是由x264的開發者提出的算法,它的基本思想是:由于視頻數據在編碼時存在依賴關系,被參考的數據的失真程度直接影響到后續的預測精度,所以根據依賴關系給予不同畫面不同碼率權重可以從整體上提升畫面質量。
MB-Tree的實現依賴于x264內部的lookahead結構。所謂的lookahead,是一種預編碼模塊。它會使用經過下采樣的低分辨率圖像預先對視頻進行一輪編碼(這種預編碼只進行到SATD的計算),并緩存大量有用的信息供后續正式編碼使用。我們在使用x264編碼視頻時,經常會看到-lookahead參數,它表示預編碼的幀數,增加這個值利于提升編碼質量,但是會增加編碼時延。
有了lookahead緩存下來的信息,我們就可以從最后一幀開始,逐幀回溯每個MB的依賴性,或者說重要性,再根據這個重要性計算QP的偏移量。MB-Tree的原理非常有特色,如果讀者對細節感興趣,推薦閱讀x264開發者的文章[4]。
PART 05 總結
本文概述了碼率控制算法的基本思想和原理,而實際的代碼實現,往往是和應用場景高度相關的。開發者不僅需要關注編碼器本身,還要結合網絡QoS和視頻特征等因素綜合考量。并且,優秀的碼率控制模塊也不太可能是一蹴而就的。不論是畫面質量與碼率平穩性的取舍,還是參數默認值的配置,都需要通過測試來不斷調優。
參考文獻
[1] JCTVC-K0103
[2] C.E. Shannon, Coding theorems for a discrete source with a fidelity criterion, in IRENational Conventwn Record, Part4, pp. 142-163, 1959.
[3] A. Ortega; K. Ramchandran, Rate-distortion methods for image and video compression, IEEE Signal Processing Magazine, Volume: 15, Issue: 6, Nov 1998.
[4] Garrett-Glaser J. A novel macroblock-tree algorithm for high-performance optimization of dependent video coding in H.264/AVC[J]. Tech. Rep., 2009.
總結
以上是生活随笔為你收集整理的视频通信中的码率控制算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UEFI开发探索42 – Protoco
- 下一篇: 白帽黑客和安全研究员必备——网安基础问答