X264代码走读一(ABR算法码控)
一、码控简介
x264码率控制主要分为单次编码(1pass)和多次编码(2pass)两大类,其中单次编码主要分如下三种:
- CRF(constant Rate Factor):恒定质量编码(运动/纹理复杂场景,码率上升;静态/纹理简单的画面,码率下降)
- CQP(constant quantization parameter):固定的量化参数,随着视频运动情况,码率会上升和下降。但是码率不可控,码率大小取决于残差大小。
- ABR(average bitrate):编码出来的视频码率在一个恒定值左右波动。该模式下,当目标码率和峰值码率配置相等的时候,就是CBR。
二、ABR算法简介
参考《X264的平均比特率控制算法优化》文档,知道X264的ABR码控流程如下:
算法公式如下:
三、实现过程
1)计算图像的satd
X264对当前图像做抽样滤波,得到分辨率是原来一半的小图。在小图上做半像素精度预测,与原图相减得到残差Xd,再对Xd做hadamond变换并求绝对和得到SATD。
1)x264_frame_init_lowres函数中会根据原图像生成一个宽高都为原图一半的子图像,保存在frame->lowres中。
2)x264_rc_analyse_slice获取当前帧的SATD。satd保存在frames->i_cost_est变量里面。frames->i_cost_est计算过程如下图所示:
2)计算图像模糊复杂度blurred_complexity
rate_estimate_qscale函数:
3)计算量化等级参数qscale。
get_qscale函数:
4)计算rate_factor
rate_estimate_qscale函数:
5)overflow计算
rate_estimate_qscale函数:
6)根据qscale计算QP
qscale2qp函数:
至此,初始帧级QP计算出来了。但是还需要根据实际编码码率和目标码率继续微调。
7)根据VBV buffer调整帧级QP
VBV(Video Buffering Verifier,视频缓存检验器),处理各帧编码后大小不一和恒定输出码率的矛盾。可将VBV想象一个水池,水池的入口连接着encoder的输出,出口为恒定码率的网络输出。为使输出恒定,encoder必须保证水池既不上溢也不下溢。下溢会导致无数据输出,上溢会导致数据丢失。所以encoder在编码一帧时会参考当前vbv的充盈情况,并由此计算出,当前帧应当编码出多少比特,从而保证既不上溢(增加QP)也不下溢(减少QP)。
clip_qscale函数
8)关于自适应量化功能
- X264_AQ_NONE
不开启AQ模式,帧内宏块全部使用同一QP或者固定的QP表
- X264_AQ_VARIANCE
使用方差动态计算每个宏块的QP。
- X264_AQ_AUTOVARIANCE
方差自适应模式,会先遍历一次全部宏块,统计出一些中间参数,之后利用这些参数,对每个宏块计算QP。
- X264_AQ_AUTOVARIANCE_BIASED
x264_adaptive_quant_frame函数
六、参考
http://www.joca.cn/CN/abstract/abstract16235.shtml
https://blog.csdn.net/u011875342/article/details/78110181
X264代码走读一(ABR算法码控)相关推荐
- X264代码走读二(intra_refresh实现)
一.RTC遇到问题 实时音视频传输对延时要求很严苛,I P size大小不均是引入延时的主要原因之一.尤其Pacer模块要平滑发送视频数据,超大I帧必然引入比较大的传输延时.<Motion Ad ...
- asp手写签名代码2021版提供源码控件
今天接了一个小事,一个朋友想实现货物在线签收,要收货人在线签名,并保存入库,让我帮忙写一个asp的手写签名功能,忙活一下午实现了,估计会有很多人有这种需求,放网上吧 function lineCanv ...
- 视频编解码 — 码控算法
目录 码控算法 码控算法的类型 具体操作过程如下 复杂度求解 帧组级 帧级 GOM级 码控算法 用算法来控制编码器输出码流的大小,码控就是为一帧图像选择一个合适的QP值的过程. 一帧图像的画面确定了 ...
- X264算法参数五(码控参数)
一.码控参数概览 X264码控参数概述 参数名称 参数类型 参数含义 备注说明 i_rc_method int 码控方法 X264_RC_CQP:固定的量化参数,随着视频运动情况,码率会上升和下降 ...
- X265码率控制——ABR算法基本原理 源码解读
作用:视频编码器里面的码率控制模块,从功能上来说,就是负责给编码器实际编码时(量化模块),提供合适的量化参数QP值,对于某一帧甚至某个宏块,到底是用高QP编码性能好,还是用低QP编码好,这个策略需要码 ...
- 视频码控:CBR、VBR和ABR
问题背景: 无论是查线上一些花屏.卡顿,马赛克问题,还是进行码率自适应的功能开发,抑或进行客户端播放器的JitterBuffer的优化,都需要编码器发送端的配合.我们需要在编码速度.网络带宽,视频质量 ...
- x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()
x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode() 宏块编码函数x264_macroblock_encode()是完成变换与量化的主要函数,而x264_m ...
- A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码注释详细,matlab源码
A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码注释详细,matlab源码 ID:4525679980340317云的歌儿
- x264代码剖析(十一):核心算法之宏块分析函数x264_macroblock_analyse()
x264代码剖析(十一):核心算法之宏块分析函数x264_macroblock_analyse() x264的 x264_slice_write()函数中调用了宏块分析函数x264_macrobloc ...
最新文章
- Sublime注释插件--DocBlockr
- 傲娇Android二三事之操蛋的开发日记(第一回)
- flutter重新配置sdk路径_在Android中配置flutter
- JS读取嵌套的JSON数据
- 服务器操作系统字符集,设置服务器字符集
- Javascript屏蔽鼠标的右键的两种方法。
- 在实践中重试HTTP标头
- python random模块安装_Python中的For循环和Random模块
- 来讲讲什么是元数据和主数据
- 迷你西游最新服务器是哪个,《迷你西游》公测增开服务器公告
- 原生javascript实现星级评价功能
- 用java实现判断回文
- Lexical Simplification with Pretrained Encoders 论文精读
- 阿里云服务器ECS添加数据盘
- 如何学好游戏3D引擎编程
- Vue实战篇二十八:实现一个手机版的购物车
- 如何使步进电机旋转更平稳的方法
- 思科 Firepower 管理中心 (Firepower Management Center) 7.1.0 下载
- 企业培训管理的误区有哪些?你中招了吗
- (wp)buuctf杂项达芬奇密码