参考资料:
[1]万帅,杨付正编著. 新一代高效视频编码H.265/HEVC 原理、标准与实现[M]. 北京:电子工业出版社, .12.
上一章:HEVC率失真优化
码率控制概述
码率控制的主要工作是建立编码速率R与量化参数QP的关系,公式化描述为:
Q∗=(Q1∗,⋯,QN∗)=argmin(Q1,⋯,QN)∑i=1NDis.t.∑i=1NRi≤Rc(1)Q^* = (Q^*_1,\dotsb,Q^*_N)=argmin_{(Q_1,\dotsb,Q_N)}\sum_{i=1}^{N}{D_i} \,\,\,\,\, s.t.\sum_{i=1}^{N}{R_i} \leq R_c \tag{1}Q∗=(Q1∗,⋯,QN∗)=argmin(Q1,⋯,QN)i=1∑NDis.t.i=1∑NRi≤Rc(1)
码率控制算法组成
比特分配:依据视频内容、缓冲区状态、信道带宽为每个编码单元(GOP、帧、CTU)分配最优的目标比特数。HEVC多种预测技术的采用使得不同编码单元间具有高度相关性,需要在该部分着重考虑。量化参数确定:依据码率R-量化参数QP模型为每个编码单元选择最优编码参数QP。QP选择受其他参数影响较小,但其采用的模型高度依赖于视频内容特征。缓冲区模型
缓冲区用于平衡编码器输出码率和信道速率。缓冲越大,适应信源、信道码率波动的性能越好,但相应地会引入较大延迟。
缓冲区采用流体流量模型建模:
Bc(n+1)=max{0,Bc(n)+A(n)−u(n)}(2)B_c(n+1) = max \lbrace 0 , B_c(n)+A(n)-u(n) \rbrace \tag{2}Bc(n+1)=max{0,Bc(n)+A(n)−u(n)}(2)
其中:
Bc(n)B_c(n)Bc(n)为第n时刻缓冲区占用A(n)A(n)A(n)为第n时刻编码器输出码率u(n)u(n)u(n)为第n时刻信道速率
目标比特分配概述
该部分给出码率控制算法理论上的指导思想,而非具体实现。
码率控制算法需要作用于不同层级依次分配比特。HEVC中层级的顺序为:GOP-Frame-CTU。
图像层目标比特分配
由于HEVC中采用了复杂的时域参考关系,因此当前图像的编码比特数分配依赖于其参考的图像。该部分详细推导见[1]第12章,这里只给出结论:
假设已编码的图像失真确定后,当前编码图像的失真D只与其比特数R有关。(拓展:该问题具有马尔可夫性?)
假设变换系数服从参数为α的拉普拉斯分布:
p(x)=α2e(−α∣x∣)p(x)=\frac{\alpha}{2}e^{(-\alpha|x|)}p(x)=2αe(−α∣x∣)
其中:α反映视频内容特性
定义失真度为绝对误差,得率失真函数:
R(D)={ln(1αD),0<D≤1α0,otherR(D) = \begin{cases} ln(\frac{1}{\alpha D}), & 0<D\leq\frac{1}{\alpha} \\ 0, & other \end{cases}R(D)={ln(αD1),0,0<D≤α1other
根据[1]中描述的依赖关系:
∂Di∂Ri=−λωi\frac{\partial D_i}{\partial R_i} = -\frac{\lambda}{\omega_i}∂Ri∂Di=−ωiλ
∂Di∂Ri=−1αie−R\frac{\partial D_i}{\partial R_i} = -\frac{1}{\alpha_i}e^{-R}∂Ri∂Di=−αi1e−R
结合上式:
Ri=−ln(αiωiλ)(3.1)R_i = -ln(\frac{\alpha_i}{\omega_i}\lambda) \tag{3.1}Ri=−ln(ωiαiλ)(3.1)
其中:
αi,ωi\alpha_i \, , \, \omega_iαi,ωi与视频内容相关ωi\omega_iωi与时域预测结构相关λ由总比特数RcR_cRc确定
上述公式的意义:只要找到λ-总比特数RcR_cRc的关系,即可为每帧图像分配最优比特数!
实际中考虑复杂度,往往做出如下假设:
时域预测结构固定,内容特性稳定,不同图像之间最优目标比特数具有较为稳定的关系。
此时问题可简化为下式:
RiRj=ln(αiωiλ)ln(αjωjλ)=ηi,j(3.2)\frac{R_i}{R_j} = \frac{ln(\frac{\alpha_i}{\omega_i}\lambda)}{ln(\frac{\alpha_j}{\omega_j}\lambda)} = \eta_{i,j} \tag{3.2}RjRi=ln(ωjαjλ)ln(ωiαiλ)=ηi,j(3.2)
∑i=1NRi=Rc(3.3)\sum_{i=1}^{N}R_i = R_c \tag{3.3}i=1∑NRi=Rc(3.3)
其中:
ηi,j\eta_{i,j}ηi,j为第i、j图像之间的相关参数,由视频内容特性、时域预测结构、总目标比特数确定。
优化:
这里假设内容特性稳定,但实际该条件不一定满足。码率控制的不少文献中也指出了该问题。
量化参数模型概述
[1]中给出了多种目前研究得到的R-QP模型,其中各个模型均包含与视频序列相关的参数。这里省略推导过程。文中详细讲述二次率失真模型的推导,可以参见H264中模型的推导。
JM编码器码率控制算法笔记:以JVT-G012r1为例
JCTVC-K0103码率控制算法实现
目标比特分配
GOP级比特分配
GOP级比特分配根据目标码率、缓冲区状态、信道速率为每个GOP分配码率。JCTVC-K0103码率控制算法根据每帧的平均比特数计算GOP的可用比特数,公式如下:
Tg=T‾f⋅NG(4.1)T_g = \overline{T}_f \cdot N_G \tag{4.1}Tg=Tf⋅NG(4.1)
T‾f=uFr+uFr×Nv,c−Rv,cSW(4.2)\overline{T}_f = \frac{u}{F_r}+\frac{\frac{u}{F_r}\times N_{v,c}-R_{v,c}}{SW} \tag{4.2}Tf=Fru+SWFru×Nv,c−Rv,c(4.2)
其中:
u为信道速率FrF_rFr为帧率Nv,cN_{v,c}Nv,c为视频序列已编码总帧数Rv,cR_{v,c}Rv,c为已编码帧消耗比特SW为滑动窗口尺寸,用于平均比特波动,一般取值40
理解:
第一项uFr\frac{u}{F_r}Fru为目标码率下平均每帧的比特数第二项uFr×Nv,c−Rv,cSW\frac{\frac{u}{F_r}\times N_{v,c}-R_{v,c}}{SW}SWFru×Nv,c−Rv,c为已编码帧消耗比特与目标消耗比特之间的偏差,反映缓冲区充盈度,该项的目的在于根据缓冲区状态对GOP的目标比特进行修正。SW反映了对于缓冲区状态的修正程度,较小SW容易导致GOP之间较大比特波动。
图像级目标比特分配
设GOP共有NGN_GNG帧,第j帧的目标比特数为:
Tf(j)=β⋅T~f(j)+(1−β)⋅T^f(j)(4.3)T_f(j)=\beta\cdot\widetilde{T}_f(j) + (1-\beta)\cdot\hat{T}_f(j) \tag{4.3}Tf(j)=β⋅Tf(j)+(1−β)⋅T^f(j)(4.3)
T~f(j)=TG×ωf(j)∑k=1Ngωf(k)(4.4)\widetilde{T}_f(j) = T_G \times \frac{\omega_f(j)}{\sum_{k=1}^{N_g}\omega_f(k)} \tag{4.4}Tf(j)=TG×∑k=1Ngωf(k)ωf(j)(4.4)
T^f(j)=TG−RG,c∑k=1Ngωf(k)⋅ωf(j)(4.5)\hat{T}_f(j) = \frac{T_G - R_{G,c}}{\sum_{k=1}^{N_g}\omega_f(k)}\cdot\omega_f(j) \tag{4.5}T^f(j)=∑k=1Ngωf(k)TG−RG,c⋅ωf(j)(4.5)
其中:
β\betaβ为权重,典型值0.9RG,cR_{G,c}RG,c为当前GOP已编码图像实际消耗比特ωf(j)\omega_f(j)ωf(j)为GOP中每帧图像权重T~f(j)\widetilde{T}_f(j)Tf(j)为根据当前GOP目标比特按每帧图像权重分配的比特数T^f(j)\hat{T}_f(j)T^f(j)为根据当前GOP剩余可用比特按每帧图像权重分配的比特数
不同参考结构GOP每帧具有不同的权重,帧间编码图像权重如下表所示:
帧内编码图像目标比特数TfT_fTf需要进行修正:
CTU级比特分配
设图像共有NLN_LNL个CTU,第m个CTU目标比特数为:
TL(m)=Tf−Hf−RL,C∑k=1NLωL(k)⋅ωL(m)(4.6)T_L(m) = \frac{T_f-H_f-R_{L,C}}{\sum_{k=1}^{N_L}\omega_L(k)}\cdot\omega_L(m) \tag{4.6}TL(m)=∑k=1NLωL(k)Tf−Hf−RL,C⋅ωL(m)(4.6)
其中:
RL,cR_{L,c}RL,c为当前GOP已编码图像实际消耗比特HfH_fHf为图像头信息比特数预测值ωL(m)\omega_L(m)ωL(m)为CTU权重,以当前图像相同层且距离最近图像对应位置CTU的MAD平方值计算
思考:
公式中ω为反映图像变化程度的量,但可能不准确:相同位置变化很大不代表运动预测后残差也大。
量化参数选择
图像级量化参数确定
实验表明,双曲函数可反映HEVC中码率-失真关系:
D(R)=CR−kD(R) = CR^{-k}D(R)=CR−k
λ=−∂D∂R=α⋅Rβ\lambda = -\frac{\partial D}{\partial R}=\alpha\cdot R^{\beta}λ=−∂R∂D=α⋅Rβ
QP与lnλ之间存在如下关系:
QP=4.lnλ+13.7122(5.1)QP = 4.ln\lambda+13.7122 \tag{5.1}QP=4.lnλ+13.7122(5.1)
图像对应的拉格朗日乘子为:
bpp=Tf(j)/Npixels,fbpp = T_f(j)/N_{pixels,f}bpp=Tf(j)/Npixels,f
λ=α⋅bppβ(5.1)\lambda = \alpha \cdot bpp^{\beta} \tag{5.1}λ=α⋅bppβ(5.1)
其中:
Tf(j)T_f(j)Tf(j)为第j帧图像的目标比特数Npixels,fN_{pixels,f}Npixels,f为该帧图像的像素数α、β为相同层距离最近图像编码完成后α、β的更新值相邻图像λ比值限定为[1/210/3,210/3][1/2^{10/3},2^{10/3}][1/210/3,210/3]相同时间层相邻图像λ比值限定为[0.5,2][0.5,2][0.5,2]相邻图像QP差异不超过10相同时间层相邻图像QP差异不超过3
编码参数更新:
其中:
δα=0.1\delta_{\alpha} = 0.1δα=0.1δβ=0.05\delta_{\beta} = 0.05δβ=0.05α范围[0.05,20]β范围[-3.0,-0.1]
当实际编码bpp’太小时,按下式更新参数:
CTU量化参数确定
CTU对应的拉格朗日乘子为:
bpp=TL(j)/Npixels,Lbpp = T_L(j)/N_{pixels,L}bpp=TL(j)/Npixels,L
λ=α⋅bppβ(5.1)\lambda = \alpha \cdot bpp^{\beta} \tag{5.1}λ=α⋅bppβ(5.1)
其中:
TL(j)T_L(j)TL(j)为第j个CTU的目标比特数Npixels,LN_{pixels,L}Npixels,L为该CTU的像素数α、β为相同层距离最近图像相同位置CTU编码完成后α、β的更新值相邻CTU的λ比值限定为[1/21/3,21/3][1/2^{1/3},2^{1/3}][1/21/3,21/3]CTU的λ与图像λ比值限定为[1/22/3,22/3][1/2^{2/3},2^{2/3}][1/22/3,22/3]相邻CTU的QP差异不超过1CTU的QP与所属图像的QO差异不超过2
编码参数更新方式同图像级模型。
总结:
与H264的码率控制策略在速录上基本相同。该算法模型大多由经验得到,准确度尚有优化空间。