音视频编解码 --X264码率控制初探
1 比特率介绍
1.1 比特率是什么?
1.2 实例说明

通过Bitrate Viewer工具查看如下,峰值在18454kpbs,最低4928kpbs,平均10014kpbs,属于比较高清、大码率的文件了。

通过MediaInfo查看,符合上面的观察,比特率大概在10Mbps左右:

2 X264码率控制说明
2.1 码率控制原理
H264标准中采用的是拉格朗日中值定理进行控制的。在数学中的最优化问题中,拉格朗日乘数法(以数学家约瑟夫·拉格朗日命名)是一种寻找多元函数在其变量受到一个或多个条件的约束时的极值的方法。这种方法可以将一个有
该方法实现复杂度非常高,在实际中应用的比较少,HM中采用该方案。
X264属于工程实践,更加追求效率和简便性,采用了一种更简单、效率高的控制策略--半精度帧的SATD算法,作为码率控制中策略选择的依据,该方案更多是根据经验总结出来的算法,但是作为指导码率控制策略是可以满足基本需求的,简便性更是拉格朗日乘数法不可比拟的。
2.2 码率控制基本函数
从FFMPEG中调用码控相关函数,基本上是x264_init和x264_frame两个地方,调用方式符合FFMPEG的接口api,代码如下:

其相关调用流程,主要是从x264_encoder_open 开始时候被创建,完成ratecontrol的构建初始化动作,然后在x264_encoder_encode时候真正开始码率控制相关内容,完成视频流的码率控制整体估计和使能操作。调用逻辑还是清晰明了的。主要的核心算法或者模块包括:lookahead、zone、ratecontrol和slice等,其部分调用流程如下图所示:

这样就可以进行码率控制了。
3 X264码率控制
X264中一共有三种码率控制参数:CQP、ABR、CRF。每种模式针对不同的场景,以及不同的视频效果不一,以下我们稍微做一些介绍,之后有时间再分别针对每种详细展开讲解。
3.1 恒定量化参数--CQP
CQP对应的类型为:

对应的Bitrate View截图如下,当用cqp = 23进行转码时,生成的码率大概如下:并且于原图进行对比,无论最大值、最小值、平均值都有了非常大的变化。同时发现波形分布基本上相同;

CQP的模式使得每帧图像采用固定大小的QP进行量化,因此每帧图像码率波动和原图像基本保持一致。
3.2 平均比特率--ABR
ABR对应的类型为:

对应的Bitrate View截图如下,大概码率设置为6Mbps,

ABR模式也是按照每帧图像的内容进行调整QP的,所以码率波动也和原视频保持一致
如果按照CBR进行转码,则波形就差异比较多了:

由于采用CBR模式,整个码率输出基本稳定在4709Kbps上下,上下峰值之前差距非常小,可以看出对应的码率严格按照固定的码率输出的。
3.3 恒定质量因子--CRF
CRF对应的类型:
进行crf转码的命令行如下:
ffmpeg -i 20210707.mp4 -c:v libx264 -b:v 6000k -crf 23 test_crf23_6M.mp4

CRF模式的码率自成一派,有点像原视频,也有差异,压缩后图像也还维持在比较好的状态。
4 计划
要理清码率控制相关内容,需要准备比较多的知识,比如RDO,比如VBV,比如量化参数;以及对于编码的深度理解。我们会分几次分别对相关内容进行讲解,依次拨开码率控制的面纱。当原理讲解清楚后,会从实战方向,说明具体参数对于网络传输的影响,以及如何进行优化以期达到理想的效果。
欢迎感兴趣的童鞋一起参与学习和探讨。
