X264 ratecontrol 码率控制

简介:

最近由于项目需要,研究了下x264的码控,发现网上这方面的资源很少!这方面据说也比较难,是x264中唯一一个数学建模的模块。
在网上找到的这篇我觉得写不错http://hi.baidu.com/sahlee/blog/item/879db7d1823c4c0a3af3cf02.html,只是代码讲解部分较少。
下面是我的学习笔记,拿出来和大家分享,有不对的地方希望有心人多多指正

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开辟的空间的


未完成...

目录
相关文章
|
存储 Linux
Linux中的进程等待(超详细)
Linux中的进程等待(超详细)
384 1
libtool: Version mismatch error 解决
libtool: Version mismatch error 解决
754 0
|
Web App开发 测试技术 网络性能优化
WebRTC 拥塞控制 | Trendline 滤波器
本文是 WebRTC 拥塞控制 第 2 篇
WebRTC 拥塞控制 | Trendline 滤波器
|
Linux 数据安全/隐私保护 Windows
更换(Pypi)pip源到国内镜像
pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.
242256 2
|
Web App开发 存储 算法
|
机器学习/深度学习 人工智能 计算机视觉
【YOLOv8】实战一:手把手教你使用YOLOv8实现实时目标检测
【YOLOv8】实战一:手把手教你使用YOLOv8实现实时目标检测
19572 0
【YOLOv8】实战一:手把手教你使用YOLOv8实现实时目标检测
|
存储 编解码 人工智能
|
并行计算 Linux 开发者
FastDeploy 预编编译Python Wheel包
FastDeploy 预编编译Python Wheel包
1004 0
|
存储 编解码 缓存
x264代码剖析(十七):核心算法之熵编码(Entropy Encoding)
<h1 style="text-align:center"><strong>x264<span style="font-family:宋体">代码剖析(十七):核心算法之熵编码(Entropy Encoding)</span></strong></h1> <p align="center"><strong></strong></p> <p> </p> <p><span style="
4546 0
|
编解码 网络性能优化
阿里云 RTC QoS 屏幕共享弱网优化之若干编码器相关优化
屏幕共享是视频会议中使用频率最高的功能之一,但在实际场景中用户所处网络环境复杂,常遇到丢包或者拥塞的情况,所以如何优化弱网环境下的用户体验也成为了音视频通信中重要的一环。本文主要分享阿里云 RTC QoS 如何通过若干编码器相关优化提升弱网环境下的屏幕共享体验。

热门文章

最新文章