X264学习3-码率控制

本文深入探讨x264编码器的码率控制,包括ABR(平均码率)和CBR(恒定码率)模式。ABR通过调整qscale来控制码率,考虑前n帧编码代价、实际bit数和量化参数。CBR则在每个宏块行编码后根据vbv buffer状态调整QP,以确保码率稳定。此外,文章还涉及了上溢和下溢的概念、重要参数及其在码率控制中的作用,以及基于HVS的自适应量化算法。
摘要由CSDN通过智能技术生成

码率控制

x264码率控制概述(version20100611)

在x264中,,码率控制主要分为ABR和CBR。ABR(average bitrate),即将码流的平均码率控制在一定的范围内。CBR(const bitrate),在编码一个宏块行时调整QP,在vbv buffer不上溢的情况下,保证目标码率和图像质量。其总体流程如下。

在这里插入图片描述

ABR码率控制(version20100611)

概述

在H.264标准中,宏块的量化参数从三个语法元素控制。图像参数集中的pic_init_qp_minus26,slice_header()中的slice_qp_delta和macroblock_layer()中的mb_qp_delta。具体详见[1]P175。

在x264中,ABR码率控制的具体流程如下。

在这里插入图片描述

在x264 ABR码率控制中,最外层为创建和删除编码器。创建编码器对应的函数为:x264_ratecontrol_new(),其主要功能是分配存储空间,初始化码率控制参数。删除编码器的函数为x264_ratecontrol_delete(),主要功能是释放存储空间。x264_ratecontrol_summary()的功能是收集当前序列的码率控制信息。

ABR码率控制的中间层为图像层面的码率控制。首先是确定当前图像的QP,对应的函数为x264_ratecontrol_start();x264_ratecontrol_qp()的功能是将QP约束在一定的范围内。编码一帧图像结束后,调用函数x264_ratecontrol_end(),更新码率控制的某些参数。

ABR的最内层为宏块层面的码率控制。编码一个宏块之前,利用x264_ratecontrol_mb_qp()获取当前宏块的QP;在编码一个宏块之后,调用函数x264_ratecontrol_mb(),主要功能是更新编码参数。

最外层的码率控制

创建码率控制器x264_ratecontrol_new()

该函数的主要功能是:分编码器h的码率控制器(h->rc)分配内存空间,并初始化其中的参数。有些参数从输入设置中初始化,有的参数利用计算的方式初始化。具体如下表。x264码率控制参数初始化如下表。

参数名称 初始化方式 含义
rc->fps 利用输入设–fps
rc->qcompress 利用输入设置–qcomp
rc->accum_p_norm 初始化为0.01 用于计算I帧的QP
rc->accum_p_qp ABR_INIT_QPrc->accum_p_norm= 240.01 用于计算I帧的QP
rc->cplxr_sum rc->qcompress和一帧的宏块数决定
rc->last_non_b_pict_type SLICE_TYPE_I(I帧) 上一幅非B帧图像的类型
rc->ip_offset 由输入设–ipratio确定 P帧QP/I帧的QP
rc->pb_offset 由输入设–pbratio确定 B帧QP/P帧的QP
rc->qp_constant[] 由rc->ip_offset,rc->pb_offset, h->param.rc.i_qp_constant决定 在固定QP编码模式下,IPB帧的QP
rc->lstep
rc->last_qscale 对应的QP为26 当前由码率控制推出的最后qscale
rc->last_qscale_for 对应的QP为ABR_INIT_QP 同一类型上一幅图像的qscale
rc->lmin[] 对应的QP为–qpmin 最小qscale
rc->lmax[] 对应的QP为–qpmax 最大qscale
rc->pred 初始化为具体的数字 用于预测的系数
rc->row_preds 初始化为具体的数字 用于预测的系数
删除码率控制器x264_ratecontrol_delete()

主要是释放内存资源。

图像层面的码率控制

概述

在本函数中,主要有两部分。第一部分为qscale2qp(rate_estimate_qscale(h)),主要用于计算当前图像的QP。第二部分为accum_p_qp_update(),主要用于更新rc的参数accum_p_qp、accum_p_norm;这些参数主要用于计算I帧的QP。

在计算QP过程中,主要是计算中间变量qscale。如果当前帧为I帧,且前一个非B帧为P帧,且不是序列的第一幅图像,其qscale由以前编码图像的QP估算出;否则由图像的编码复杂度,分配的bit数、实际使用的bit数、实际使用的量化参数计算出。

非I帧的qscale:rate_estimate_qscale()

qscale为计算QP的中间变量。影响qscale的因素有两方面:前n帧平均加权(估算)编码代价,编码已分配的bit数、过去图像实际消耗的bit数及实际使用的量化参数。

前n帧平均加权(估算)的编码代价

前n帧加权的编码代价,是前n帧估算出编码代价的加权和。离第n帧比较远的帧,其加权系数要小些;比较近的帧,其加权系数要大些。在代码中对应的变量为rce.blurred_complexity,计算方式如下。计算前n帧加权编码代价主要变量一览表。

公式变量 代码变量 具体含义
n 编码图像序号。第一幅编码图像的序号为0,依次加1。
di rcc->last_satd 第i幅图像的编码代价
mi rcc->short_term_cplxsum 在第i帧,编码图像的累积编码代价
ti rcc->short_term_cplxcount 在第i帧,编码图像的累积序号
bi rcc->wanted_bits_window 在第i帧,编码已分配的bit数
ci rce.blurred_complexity 从第0帧开始,前i帧的平均编码代价

各变量之间的相互关系如下。设当前编码图像的序号为n。BitNumberOfiFrame:分配给第i帧的bit数。
m n = ∑ i = 0 n d i 2 n − i t n = ∑ i = 0 n 1 2 n − i b n = ∑ i = 0 n B i t N u m b e r O f i F r a m e c n = m n t n \begin{array}{l} {m_n} = \sum\limits_{i = 0}^n {\frac{ { {d_i}}}{ { {2^{n - i}}}}} \\ {t_n} = \sum\limits_{i = 0}^n {\frac{1}{ { {2^{n - i}}}}} \\ {b_n} = \sum\limits_{i = 0}^n { {\rm{BitNumberOf}}iFrame} \\ {c_n} = \frac{ { {m_n}}}{ { {t_n}}} \end{array} mn=i=0n2niditn=i=0n2ni1bn=i=0nBitNumberOfiFramecn=tnmn

过去图像实际消耗的bit数及实际使用的量化参数

这个变量的计算位于函数x264_ratecontrol_end(),其计算方式如下。计算前n帧加权编码代价主要变量一览表如下。

公式变量 代码变量 具体含义
a_bi bits 第i帧实际消耗的bit数
q_ai rc->qpa_rc 在码率控制模式下,第i帧所有宏块的平均QP
l_rci rc->last_rceq 在只有图像复杂度影响的情况下,第i幅图像的qscale,关于此变量的计算,详见函数get_qscale()
q rcc->qcompress 为常数,说明图像复杂度对qscale的影响
c_si rc->cplxr_sum 已编码图像的复杂度

l _ r c i = ( c i ) 1 − q c _ s n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值