[码率控制] x264实时编码的码率控制--一个简单的QP调节方法

在用x264做实时视频,由于用在智能手机上,计算能力有限,网络带宽有限,故设计了一个简单的新的码率控制算法,效果还不错,与大家分享。

一般做实时视频,x264作者推荐用vbv-CBR模式,这样来稳定码流,适应带宽。
但对于嵌入式系统,CBR模式计算量较大。CBR模式需要进行前期的半精度SATD值计算,以得到图像复杂度,进而得到预计的bits(这一SATD还用在slice type的选择,实际这个计算过程的函数就叫 slice_type_decision, 在lookaheand_get_frame中);通过预计bits与期望bits的比较得到qscale,进而得到本编码帧的QP。当然若用上 mb_tree,aq_mode还更复杂。

这一前期的计算过程大致占整个计算量的12%-20%(根据参数的不同),但若略去这步,使用固定QP,码率波动较大。

现设计了一个新的模式,利用帧间的相似性,根据上一帧编码的实际bits与期望bits的差,来调节QP(帧级调整)。实现上的思路也很简单,利用CQP模式的壳,在每帧编码前再次调节QP。
需要采用参数如下:
--scenecut 0---(不需额外增加 i 帧,由于实时不需b帧,故一个GOP组中,只有一个IDR帧及其余的P帧);
--bframes 0 不要B帧
对于嵌入式,手机等系统,建议采用:
--subme 1 1/4精度的SAD值
--partition none 不要划分 (可提高编码速度,节省码流,psnr基本不变)
--no-8x8dct (这个是high profile, 不需要,同样可加快编码,节省码流)
其余参数可参见,x264 --preset-veryfast的参数配置;

好了接下来是帧级的码流控制,即调节QP;
1. 在x264参数中添加新码率控制的参数(get_opt函数),如: --newqp <bitrate>
2. 这个newqp与CQP,可以起使用。
    可照常使用--qp <integer>的形式给出初始qp,若无,则初始默认为23;
3. 控制流程:
    1)在本帧编码前,获取上一编码帧的实际大小,单位最好用 bit, 这样便于后面的调节;
    2)根据设定的bitrate,得到期望的编码帧实际大小, 即bitrate/fps (此处的FPS是输出,一般是25);
    3)拟合qp-bitrate曲线:
          比如:现在目标是视频通讯,画面复杂度不高,找到这样的片源,用上述选定参数实验不同固定QP下的qp-bitrates曲线;
    4)根据拟合曲线及目标bitrate,选出关键的调节点;

以上是整体流程,目前实验的效果是:比如设定500kbps ,超越上限在1%以内,最低在5%以内;
但如果用片源变了,如换成画面复杂度较高的,则上限在5%,下限15%左右;
这主要是调节点是针对某一类片源设定的;
为此,设计了一个简单的权重数组,根据不同设定的bitrate来改变调节点的值,目前看,控制精度有所提高:上限1%,下限10%。
计算量上:可忽略,只是每帧多了上百次的加减乘除;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值