博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
X264 ratecontrol 码率控制
阅读量:7083 次
发布时间:2019-06-28

本文共 2070 字,大约阅读时间需要 6 分钟。

最近由于项目需要,研究了下x264的码控,发现网上这方面的资源很少!这方面据说也比较难,是x264中唯一一个数学建模的模块。

在网上找到的这篇我觉得写不错,只是代码讲解部分较少。
下面是我的学习笔记,拿出来和大家分享,有不对的地方希望有心人多多指正

x264中ratecontrol主要过程是;

1.根据前面已经编好的帧计算SATD值来预测当前帧的复杂度(第一帧I帧除外);

2.计算好复杂度之后,根据复杂度和线性量化控制参数(qcomp)来计算qpscale。qpscale会影响最终编码是所用到qp。
3.根据目标码率和之前编码帧所用的比特数可以确定一个rate_factor,若之前编码的比特数多与目标实际产生,则rate_factor小。
这个rate_factor是调整qpscale用的,还有overflow来对qpscale来做溢出补偿处理来控制文件的大小。
4.最后根据计算公式得到qp

主要的函数

1.

x264_ratecontrol_new()函数中的一些关键参数
rc->bitrate = h->param.rc.i_bitrate * 1000.; ///目标码率
rc->rate_tolerance = h->param.rc.f_rate_tolerance; ///允许的误差
rc->nmb = h->mb.i_mb_count; ///要编码的宏块数
rc->cplxr_sum = .01 * pow( 7.0e5, h->param.rc.f_qcompress ) * pow( h->mb.i_mb_count, 0.5 ); 
rc->wanted_bits_window = /*1.0 **/ rc->bitrate / rc->fps; 
///得到ratefactor

2.

在x264_encoder_encode这个函数里面的x264_frame_init_lowres( h, fenc )是对当前帧进行一个下采样,将cif格式的图像下采样为qcif格式。为后面计算SATD做好准备。

x264_ratecontrol_start()

|
rate_estimate_qscale()
rcc->last_satd = x264_stack_align( x264_rc_analyse_slice, h ); ///这个分析之前下采样出来的SATD的函数
q = get_qscale( h, &rce, rcc->wanted_bits_window / rcc->cplxr_sum, h->fenc->i_frame ); ///根据前面已编好帧的比特数计算rate_factor来调整qpscale
|
qpscale2qp() ///将得到的qpscale转换成qp

3.
encode--->Encode_frame--->x264_encoder_encode--->x264_slices_write--->x264_slice_write--->x264_ratecontrol_mb 
int b0 = predict_row_size_sum( h, y, rc->qpm );这里是计算将要编码帧的复杂度,此函数内部涉及到了SATD的计算还有一些和论文相符的复杂度计算
///细节没看明白,但感觉是在编宏块的时候调整QP之类的

4.

encode--->Encode_frame--->x264_encoder_encode--->x264_ratecontrol_end /在编完一帧过后
x264_ratecontrol_end()函数
h->fdec->f_qp_avg_rc = rc->qpa_rc /= h->mb.i_mb_count; ///aq之前的qp 根据变量的字面意思应该根据宏块的个数来计算qp的平均值
h->fdec->f_qp_avg_aq = rc->qpa_aq /= h->mb.i_mb_count; ///aq之后的qp aq是什么?

if( rc->b_abr )
{
rc->cplxr_sum += bits * qp2qscale(rc->qpa_rc) / rc->last_rceq;

rc->cplxr_sum *= rc->cbr_decay;

rc->wanted_bits_window += rc->bitrate / rc->fps;
rc->wanted_bits_window *= rc->cbr_decay;
accum_p_qp_update( h, rc->qpa_rc );
}
这一段应该是在统计已编好帧的bit数,为编下一帧的qp调整做好准备

5.

x264_ratecontrol_summary和x264_ratecontrol_delete这两个函数不知道为什么没有走到,summary函数不知是做什么用的,delete就很明显是用来释放rc开辟的空间的

未完成...

转载地址:http://armml.baihongyu.com/

你可能感兴趣的文章
POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用
查看>>
python3中input()方法报错traceback变量未定义的解决方法
查看>>
animation渐进实现点点点等待效果实例页面
查看>>
配置 ssh无密码登陆
查看>>
java读取和写入浏览器Cookies
查看>>
熟悉常用的HDFS操作
查看>>
SCM软件配置管理 (一)SVN 与 CVS
查看>>
js闭包
查看>>
CocoaPods Setting up CocoaPods master repo无反应时的处理
查看>>
linux驱动系列之s3c2440内存布局
查看>>
asp.net上传文件大小限制
查看>>
javascript基础拾遗——词法作用域
查看>>
该来的年终总结,还是来了
查看>>
HustOJ - 1001
查看>>
typedef void far *LPVOID 的具体定义
查看>>
webp图片转换工具
查看>>
2015.12.24(圣诞节) 解决Oralce数据库将具有相同属性的多行合并为一行的简单方法多年想要wmsys.wm_concat...
查看>>
嵌入式Linux之旅——环境搭建篇之烧写整个系统
查看>>
批量删除.svn文件夹、.svn文件
查看>>
python orm框架
查看>>