文章目錄
- 1. 比特配置設定
-
- 1.1 GOP級比特配置設定
- 1.2 幀級比特配置設定
- 1.3 LCU級比特配置設定
- 2. 碼率控制
-
- 2.1 λ的計算和更新
- 2.2 參數QP的确定
VVC中碼率控制算法沿用了HEVC中經典的 R-λ碼率控制模型, R-λ由中科大的李斌博士提出(詳情參考
JCTVC-K0103
)。 R-λ模型的基礎為視訊編碼中 R(比特 bpp)和 D(失真 MSE)之間的雙曲線模型,即
D ( R ) = C R − K D(R) = CR^{-K} D(R)=CR−K
R-λ模型中λ是R-D曲線的斜率,對上式求導,可得
λ = − ∂ D ∂ R = C K ⋅ R − K − 1 ≜ α ⋅ R β \lambda=-\frac{\partial D}{\partial R} = CK\cdot R^{-K-1} \triangleq \alpha \cdot R^ \beta λ=−∂R∂D=CK⋅R−K−1≜α⋅Rβ
其中 α α α和 β β β是和視訊内容相關的參數。
碼率控制主要可分成兩個步驟:
1. 首先是比特配置設定,即将序列目标比特以一定政策确定GOP、幀和LCU各級單元的目标編碼比特。
2. 依據配置設定到的目标比特,通過調整編碼單元的編碼參數,以達到配置設定到的目标比特。
1. 比特配置設定
一般情況下,序列第一幀所需配置設定的比特需要特殊考慮,第一幀的品質會很大程度上影響後續的編碼效率和品質。實際應用中,第一幀的編碼參數會根據一些先驗知識進行設定。編碼第一幀所需比特由于缺乏必要先驗資訊很難預測,一般采取的政策即給第一幀多配置設定,以保證品質。
首先定義平均每幀比特
R p i c A v g = R t a r / F R R_{picAvg} = R_{tar} / FR RpicAvg=Rtar/FR
其中 R t a r R_{tar} Rtar為目标比特,FR為幀率。
1.1 GOP級比特配置設定
一般來說,每個GOP所配置設定的比特應該是一樣的,但是由于實際編碼的比特和目标比特總是有差異,GOP級比特配置設定引入滑動視窗SW來消除每個GOP的實際編碼比特與目标比特的誤差,每個GOP所配置設定的比特計算如下
T G O P = R p i c A v g ⋅ ( N c o d e d + S W ) − R c o d e d S W × N G O P T_{GOP} = \frac{R_{picAvg}\cdot (N_{coded} + SW) - R_{coded}}{SW} \times N_{GOP} TGOP=SWRpicAvg⋅(Ncoded+SW)−Rcoded×NGOP
公式寫成這樣可能比較不容易了解,換個表達如下
T G O P = T p i c A v g × N G O P T_{GOP} = T_{picAvg}\times N_{GOP} TGOP=TpicAvg×NGOP 其中 T p i c A v g = R p i c A v g + R p i c A v g ⋅ N c o d e d − R c o d e d S W T_{picAvg} = R_{picAvg} + \frac{R_{picAvg} \cdot N_{coded} - R_{coded}}{SW} TpicAvg=RpicAvg+SWRpicAvg⋅Ncoded−Rcoded
顯然, R p i c A v g R_{picAvg} RpicAvg為目标碼率, R p i c A v g ⋅ N c o d e d − R c o d e d R_{picAvg} \cdot N_{coded} - R_{coded} RpicAvg⋅Ncoded−Rcoded為誤差項,需要以SW為長度進行修正。
1.2 幀級比特配置設定
定義 T G O P T_{GOP} TGOP為目前GOP目标比特, C o d e d G O P Coded_{GOP} CodedGOP為目前GOP已消耗比特, ω \omega ω為目前GOP中每幀圖檔比特配置設定權重,于是目前幀所配置設定的比特計算如下
T p i c = T G O P − C o d e d G O P ∑ m = 0 N R P ω p i c _ m × ω c u r r P i c T_{pic} = \frac{T_{GOP} - Coded_{GOP}}{ \sum_{m=0}^{N_{RP}} \omega_{pic\_m}} \times \omega_{currPic} Tpic=∑m=0NRPωpic_mTGOP−CodedGOP×ωcurrPic
需要注意,I幀所配置設定的比特由bpp決定。
1.3 LCU級比特配置設定
類似于幀級比特配置設定政策,每個LCU所配置設定到的比特通過下式計算:
T L C U = T c u r r P i c − B i t H − C o d e d p i c ∑ A l l N o t C o d e d L C U ω L C U × ω c u r r L C U T_{LCU} = \frac{T_{currPic} - Bit_{H}-Coded_{pic}}{\sum_{AllNotCodedLCU} \omega_{LCU}} \times \omega_{currLCU} TLCU=∑AllNotCodedLCUωLCUTcurrPic−BitH−Codedpic×ωcurrLCU
其中 B i t H Bit_{H} BitH為所有頭資訊編碼所需比特,由之前對應已編碼幀所用比特預測得到。 ω L C U \omega_{LCU} ωLCU為每個LCU碼率配置設定權重,由之前屬于同一level 的已編碼幀對應位置的LCU的預測誤差(原始和預測信号的MAD)計算得到。
2. 碼率控制
2.1 λ的計算和更新
根據 λ \lambda λ與R之間的關系 λ = − ∂ D ∂ R = C K ⋅ R − K − 1 ≜ α ⋅ R β \lambda=-\frac{\partial D}{\partial R} = CK\cdot R^{-K-1} \triangleq \alpha \cdot R^ \beta λ=−∂R∂D=CK⋅R−K−1≜α⋅Rβ,即 λ \lambda λ可由R通過 α \alpha α和 β \beta β直接計算得到。但是 α \alpha α和 β \beta β是和序列内容特性相關的參數,不同内容其值差異顯著。R-λ模型通過引入如下算法解決此問題,首先使用下式計算幀和LCU的 λ \lambda λ
λ = α b p p β \lambda = \alpha bpp ^ {\beta} λ=αbppβ
這裡 α \alpha α和 β \beta β對每幀和每個LCU都是不同的。為了實作内容自适應, α \alpha α和 β \beta β會在編碼過程中不斷更新,在完成一個LCU或者一幀圖像的編碼後, α \alpha α和 β \beta β更新方式如下
λ = α o l d b p p r e a l β o l d \lambda = \alpha_{old} bpp_{real} ^ {\beta_{old}} λ=αoldbpprealβold α n e w = α o l d + δ α × ( ln λ r e a l − ln λ c o m p ) × α o l d \alpha_{new} = \alpha_{old} + \delta_{ \alpha } \times (\ln\lambda_{real}-\ln\lambda_{comp} ) \times \alpha_{old} αnew=αold+δα×(lnλreal−lnλcomp)×αold β n e w = β o l d + δ β × ( ln λ r e a l − ln λ c o m p ) × ln b p p r e a l \beta_{new} = \beta_{old} + \delta_{ \beta } \times (\ln\lambda_{real}-\ln\lambda_{comp} ) \times \ln{bpp_{real}} βnew=βold+δβ×(lnλreal−lnλcomp)×lnbppreal
其中 b p p r e a l bpp_{real} bppreal為編碼實際的bpp, λ r e a l \lambda{real} λreal為實際使用λ。
記住以下這個公式:
R = ( λ α ) 1 β ≜ α 1 ⋅ λ β 1 R=( \frac{ \lambda }{\alpha })^{\frac{1}{\beta}}\triangleq \alpha_1 \cdot \lambda^{\beta_1} R=(αλ)β1≜α1⋅λβ1。
2.2 參數QP的确定
當 λ \lambda λ确定之後,QP的計算方式如下
Q P = c 1 × ln ( λ ) + c 2 QP = c_1 \times \ln(\lambda)+c_2 QP=c1×ln(λ)+c2
其中 c 1 c_1 c1和 c 2 c_2 c2分别等于4.2005和13.7122。