一、码控简介

x264码率控制主要分为单次编码(1pass)和多次编码(2pass)两大类,其中单次编码主要分如下三种:

  1. CRF(constant Rate Factor):恒定质量编码(运动/纹理复杂场景,码率上升;静态/纹理简单的画面,码率下降)
  2. CQP(constant quantization parameter):固定的量化参数,随着视频运动情况,码率会上升和下降。但是码率不可控,码率大小取决于残差大小。
  3. 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算法码控)相关推荐

  1. X264代码走读二(intra_refresh实现)

    一.RTC遇到问题 实时音视频传输对延时要求很严苛,I P size大小不均是引入延时的主要原因之一.尤其Pacer模块要平滑发送视频数据,超大I帧必然引入比较大的传输延时.<Motion Ad ...

  2. asp手写签名代码2021版提供源码控件

    今天接了一个小事,一个朋友想实现货物在线签收,要收货人在线签名,并保存入库,让我帮忙写一个asp的手写签名功能,忙活一下午实现了,估计会有很多人有这种需求,放网上吧 function lineCanv ...

  3. 视频编解码 — 码控算法

    目录 码控算法 码控算法的类型 具体操作过程如下 复杂度求解 帧组级 帧级 GOM级 码控算法  用算法来控制编码器输出码流的大小,码控就是为一帧图像选择一个合适的QP值的过程. 一帧图像的画面确定了 ...

  4. X264算法参数五(码控参数)

    一.码控参数概览 X264码控参数概述 参数名称 参数类型 参数含义 备注说明 i_rc_method int   码控方法 X264_RC_CQP:固定的量化参数,随着视频运动情况,码率会上升和下降 ...

  5. X265码率控制——ABR算法基本原理 源码解读

    作用:视频编码器里面的码率控制模块,从功能上来说,就是负责给编码器实际编码时(量化模块),提供合适的量化参数QP值,对于某一帧甚至某个宏块,到底是用高QP编码性能好,还是用低QP编码好,这个策略需要码 ...

  6. 视频码控:CBR、VBR和ABR

    问题背景: 无论是查线上一些花屏.卡顿,马赛克问题,还是进行码率自适应的功能开发,抑或进行客户端播放器的JitterBuffer的优化,都需要编码器发送端的配合.我们需要在编码速度.网络带宽,视频质量 ...

  7. x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()

    x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode() 宏块编码函数x264_macroblock_encode()是完成变换与量化的主要函数,而x264_m ...

  8. A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码注释详细,matlab源码

    A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码注释详细,matlab源码 ID:4525679980340317云的歌儿

  9. x264代码剖析(十一):核心算法之宏块分析函数x264_macroblock_analyse()

    x264代码剖析(十一):核心算法之宏块分析函数x264_macroblock_analyse() x264的 x264_slice_write()函数中调用了宏块分析函数x264_macrobloc ...

最新文章

  1. Sublime注释插件--DocBlockr
  2. 傲娇Android二三事之操蛋的开发日记(第一回)
  3. flutter重新配置sdk路径_在Android中配置flutter
  4. JS读取嵌套的JSON数据
  5. 服务器操作系统字符集,设置服务器字符集
  6. Javascript屏蔽鼠标的右键的两种方法。
  7. 在实践中重试HTTP标头
  8. python random模块安装_Python中的For循环和Random模块
  9. 来讲讲什么是元数据和主数据
  10. 迷你西游最新服务器是哪个,《迷你西游》公测增开服务器公告
  11. 原生javascript实现星级评价功能
  12. 用java实现判断回文
  13. Lexical Simplification with Pretrained Encoders 论文精读
  14. 阿里云服务器ECS添加数据盘
  15. 如何学好游戏3D引擎编程
  16. Vue实战篇二十八:实现一个手机版的购物车
  17. 如何使步进电机旋转更平稳的方法
  18. 思科 Firepower 管理中心 (Firepower Management Center) 7.1.0 下载
  19. 企业培训管理的误区有哪些?你中招了吗
  20. (wp)buuctf杂项达芬奇密码

热门文章

  1. auto.js实现淘宝快速提交订单
  2. 题目1163:素数 九度OJ
  3. 在探索中享受童年般的乐趣 |Mixlab的故事
  4. 经典SQL学习笔记 (四)-子查询
  5. Oracle同步数据到MySQL
  6. java对接海康威视SDk实现红外DL/T抓图
  7. 【饭谈】为什么别人都劝你别做外包?
  8. 视频文件打不开怎么修复
  9. 老毛桃重启计算机没反应,老毛桃怎么用
  10. pythonttf字体反爬虫_利用Python采集起点中文网小说,并解决字体反爬的问题