[码率控制] x264实时编码的码率控制--一个简单的QP调节方法
2013-09-07 10:45
666 查看
在用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%。
计算量上:可忽略,只是每帧多了上百次的加减乘除;
一般做实时视频,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%。
计算量上:可忽略,只是每帧多了上百次的加减乘除;
相关文章推荐
- 一个简单的验证字符串是否为Base64编码的方法
- x264编码指南——码率控制
- TI 816x编码码率控制实现宏块级及帧级的qp变化
- ReportMachine 控制打印走纸的一个简单方法
- x264编码指南——码率控制
- c/c++ 使用boost库实现的一个简单判断字符串编码的方法
- x264编码指南——码率控制
- 编码码率控制方法
- x264编码指南——码率控制
- X264码率控制总结2——x264码率控制方法概述
- X264码率控制总结2——x264码率控制方法概述
- x264编码指南——码率控制
- X264码率控制总结2——x264码率控制方法概述
- x264编码----码率控制
- 一个非常简单的菜单栏折叠控制方法
- X264码率控制总结2——x264码率控制方法概述
- WinForm控制progressBar 进度的一个简单方法
- x264 重新编码实时视频 (视频压缩的一个思路)
- x264码率控制方法介绍
- 一个处理UTF-8编码文件BOM头的简单方法