X264代码走读一(ABR算法码控)

本文深入探讨了x264视频编码器的码率控制机制,包括CRF、CQP、ABR和CBR等编码模式,重点解析了ABR算法的工作流程和实现细节,从图像复杂度评估到量化参数调整,再到自适应量化功能,全面覆盖了x264码控的关键技术。

一、码控简介

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.youkuaiyun.com/u011875342/article/details/78110181

### 解读 x264器源代码 #### 主要组件与功能概述 x264种广泛使用的 H.264/AVC 编库,其源代码结构较为复杂且涉及大量高级压缩技术。为了更好地理解和掌握该编器的工作原理,可以从以下几个方面入手: 1. **初始化过程** `x264_encoder_open()` 负责创建个新的编会话实例,并完成必要的初始化工作。这包括设置默认配置选项、分配内存资源以及准备内部数据结构等操作[^2]。 2. **头部信息生成** 使用 `x264_encoder_headers()` 可以为当前序列生成SPS (Sequence Parameter Set) 和PPS (Picture Parameter Set),这些参数集描述了视频流的基本属性和编解规则,在实际传输前需先发送给解端以便后续帧级处理能够正常执行。 3. **核心编逻辑** 关键在于实现高效的图像预测、变换量化及熵编等功能模块。`x264_encoder_encode()` 构成了整个编流程的核心环节,负责接收原始像素数据作为输入并输出已编好的NAL单元(NAL Unit)。 4. **清理释放** 当不再需要继续编时,通过调用 `x264_encoder_close()` 来安全地关闭现有会话,确保所有占用的系统资源得到妥善回收。 5. **辅助工具函数** 此外还存在许多用于支持上述主要步骤的小型实用程序方法,比如用来构建网络抽象层(Network Abstraction Layer, NAL)包头信息的 `x264_nal_encode()` ,它依据具体应用场景选择合适的起始格式以适应不同类型的承载协议需求[^3]。 ```c // 示例:简单的命令行解析与编启动 int main(int argc, char *argv[]) { parse(argc, argv); // 处理传入参数 encode(); // 开始编进程 } ``` 对于希望深入学习 x264 的开发者而言,建议按照以上提到的关键点逐步展开研究;同时可以参考官方文档和其他开源项目中的实践案例加深理解。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值