参考资料:
[1]万帅,杨付正编著. 新一代高效视频编码H.265/HEVC 原理、标准与实现[M]. 北京:电子工业出版社, 2014.12.
上一章:HEVC率失真优化
码率控制概述
码率控制的主要工作是建立编码速率R与量化参数QP的关系,公式化描述为:
Q
∗
=
(
Q
1
∗
,
⋯
,
Q
N
∗
)
=
a
r
g
m
i
n
(
Q
1
,
⋯
,
Q
N
)
∑
i
=
1
N
D
i
s
.
t
.
∑
i
=
1
N
R
i
≤
R
c
(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选择受其他参数影响较小,但其采用的模型高度依赖于视频内容特征。
缓冲区模型
缓冲区用于平衡编码器输出码率和信道速率。缓冲越大,适应信源、信道码率波动的性能越好,但相应地会引入较大延迟。
缓冲区采用流体流量模型建模:
B
c
(
n
+
1
)
=
m
a
x
{
0
,
B
c
(
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)
其中:
- B c ( 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
)
=
α
2
e
(
−
α
∣
x
∣
)
p(x)=\frac{\alpha}{2}e^{(-\alpha|x|)}
p(x)=2αe(−α∣x∣)
其中:α反映视频内容特性
定义失真度为绝对误差,得率失真函数:
R
(
D
)
=
{
l
n
(
1
α
D
)
,
0
<
D
≤
1
α
0
,
o
t
h
e
r
R(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]中描述的依赖关系:
∂
D
i
∂
R
i
=
−
λ
ω
i
\frac{\partial D_i}{\partial R_i} = -\frac{\lambda}{\omega_i}
∂Ri∂Di=−ωiλ
∂
D
i
∂
R
i
=
−
1
α
i
e
−
R
\frac{\partial D_i}{\partial R_i} = -\frac{1}{\alpha_i}e^{-R}
∂Ri∂Di=−αi1e−R
结合上式:
R
i
=
−
l
n
(
α
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与时域预测结构相关
- λ由总比特数 R c R_c Rc确定
上述公式的意义:只要找到λ-总比特数 R c R_c Rc的关系,即可为每帧图像分配最优比特数!
实际中考虑复杂度,往往做出如下假设:
- 时域预测结构固定,内容特性稳定,不同图像之间最优目标比特数具有较为稳定的关系。
此时问题可简化为下式:
R
i
R
j
=
l
n
(
α
i
ω
i
λ
)
l
n
(
α
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
=
1
N
R
i
=
R
c
(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的可用比特数,公式如下:
T
g
=
T
‾
f
⋅
N
G
(4.1)
T_g = \overline{T}_f \cdot N_G \tag{4.1}
Tg=Tf⋅NG(4.1)
T
‾
f
=
u
F
r
+
u
F
r
×
N
v
,
c
−
R
v
,
c
S
W
(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为信道速率
- F r F_r Fr为帧率
- N v , c N_{v,c} Nv,c为视频序列已编码总帧数
- R v , c R_{v,c} Rv,c为已编码帧消耗比特
- SW为滑动窗口尺寸,用于平均比特波动,一般取值40
理解:
- 第一项 u F r \frac{u}{F_r} Fru为目标码率下平均每帧的比特数
- 第二项 u F r × N v , c − R v , c S W \frac{\frac{u}{F_r}\times N_{v,c}-R_{v,c}}{SW} SWFru×Nv,c−Rv,c为已编码帧消耗比特与目标消耗比特之间的偏差,反映缓冲区充盈度,该项的目的在于根据缓冲区状态对GOP的目标比特进行修正。
- SW反映了对于缓冲区状态的修正程度,较小SW容易导致GOP之间较大比特波动。
图像级目标比特分配
设GOP共有
N
G
N_G
NG帧,第j帧的目标比特数为:
T
f
(
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)=β⋅T
f(j)+(1−β)⋅T^f(j)(4.3)
T
~
f
(
j
)
=
T
G
×
ω
f
(
j
)
∑
k
=
1
N
g
ω
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}
T
f(j)=TG×∑k=1Ngωf(k)ωf(j)(4.4)
T
^
f
(
j
)
=
T
G
−
R
G
,
c
∑
k
=
1
N
g
ω
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.9
- R G , c R_{G,c} RG,c为当前GOP已编码图像实际消耗比特
- ω f ( j ) \omega_f(j) ωf(j)为GOP中每帧图像权重
- T ~ f ( j ) \widetilde{T}_f(j) T f(j)为根据当前GOP目标比特按每帧图像权重分配的比特数
- T ^ f ( j ) \hat{T}_f(j) T^f(j)为根据当前GOP剩余可用比特按每帧图像权重分配的比特数
不同参考结构GOP每帧具有不同的权重,帧间编码图像权重如下表所示:
帧内编码图像目标比特数
T
f
T_f
Tf需要进行修正:
CTU级比特分配
设图像共有
N
L
N_L
NL个CTU,第m个CTU目标比特数为:
T
L
(
m
)
=
T
f
−
H
f
−
R
L
,
C
∑
k
=
1
N
L
ω
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)
其中:
- R L , c R_{L,c} RL,c为当前GOP已编码图像实际消耗比特
- H f H_f Hf为图像头信息比特数预测值
- ω L ( m ) \omega_L(m) ωL(m)为CTU权重,以当前图像相同层且距离最近图像对应位置CTU的MAD平方值计算
思考:
- 公式中ω为反映图像变化程度的量,但可能不准确:相同位置变化很大不代表运动预测后残差也大。
量化参数选择
图像级量化参数确定
实验表明,双曲函数可反映HEVC中码率-失真关系:
D
(
R
)
=
C
R
−
k
D(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λ之间存在如下关系:
Q
P
=
4.2005
l
n
λ
+
13.7122
(5.1)
QP = 4.2005ln\lambda+13.7122 \tag{5.1}
QP=4.2005lnλ+13.7122(5.1)
图像对应的拉格朗日乘子为:
b
p
p
=
T
f
(
j
)
/
N
p
i
x
e
l
s
,
f
bpp = T_f(j)/N_{pixels,f}
bpp=Tf(j)/Npixels,f
λ
=
α
⋅
b
p
p
β
(5.1)
\lambda = \alpha \cdot bpp^{\beta} \tag{5.1}
λ=α⋅bppβ(5.1)
其中:
- T f ( j ) T_f(j) Tf(j)为第j帧图像的目标比特数
- N p i x e l s , f N_{pixels,f} Npixels,f为该帧图像的像素数
- α、β为相同层距离最近图像编码完成后α、β的更新值
- 相邻图像λ比值限定为 [ 1 / 2 10 / 3 , 2 10 / 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对应的拉格朗日乘子为:
b
p
p
=
T
L
(
j
)
/
N
p
i
x
e
l
s
,
L
bpp = T_L(j)/N_{pixels,L}
bpp=TL(j)/Npixels,L
λ
=
α
⋅
b
p
p
β
(5.1)
\lambda = \alpha \cdot bpp^{\beta} \tag{5.1}
λ=α⋅bppβ(5.1)
其中:
- T L ( j ) T_L(j) TL(j)为第j个CTU的目标比特数
- N p i x e l s , L N_{pixels,L} Npixels,L为该CTU的像素数
- α、β为相同层距离最近图像相同位置CTU编码完成后α、β的更新值
- 相邻CTU的λ比值限定为 [ 1 / 2 1 / 3 , 2 1 / 3 ] [1/2^{1/3},2^{1/3}] [1/21/3,21/3]
- CTU的λ与图像λ比值限定为 [ 1 / 2 2 / 3 , 2 2 / 3 ] [1/2^{2/3},2^{2/3}] [1/22/3,22/3]
- 相邻CTU的QP差异不超过1
- CTU的QP与所属图像的QO差异不超过2
编码参数更新方式同图像级模型。
总结:
与H264的码率控制策略在速录上基本相同。该算法模型大多由经验得到,准确度尚有优化空间。