X264 码率控制说明
码率控制原理
H264 标准中采用的是拉格朗日中值定理进行控制的。在数学中的最优化问题中,拉格朗日乘数法(以数学家约瑟夫·拉格朗日命名)是一种寻找多元函数在其变量受到一个或多个条件的约束时的极值的方法。这种方法可以将一个有 n 个变量与 k 个约束条件的最优化问题转换为一个解有 n + k 个变量的方程组的解的问题。
该方法实现复杂度非常高,在实际中应用的比较少,HM 中采用该方案。
X264 属于工程实践,更加追求效率和简便性,采用了一种更简单、效率高的控制策略–半精度帧的 SATD 算法,作为码率控制中策略选择的依据,该方案更多是根据经验总结出来的算法,但是作为指导码率控制策略是可以满足基本需求的,简便性更是拉格朗日乘数法不可比拟的。
码率控制基本函数
从 FFMPEG 中调用码控相关函数,基本上是 x264_init 和 x264_frame 两个地方,调用方式符合 FFMPEG 的接口 api,代码如下:
其相关调用流程如下:
这样就可以进行码率控制了。
X264 码率控制
这里简单说明一下,主要是跟踪 X264 的代码说明参数如何使用的。
X264 中一共有三种码率控制参数:CQP、ABR、CRF。以下我们稍微做一些介绍
恒定量化参数–CQP
CQP 对应的类型为:X264_RC_CQP;该值表示恒定量化参数,编码器会尽量把每帧图像采用相同的量化参数;该方法并不推荐。由于每帧图像都采用相同的量化参数,会导致静止图像浪费码率,运动激烈,变化突出的图像码率不够,而且码率也会有剧烈变化,呈现明显锯齿状;还有需要注意的是 libvpx 是不支持改模式的。
通过实例查看,通过 FFMPEG 命令,我们转码为 6Mbps 左右,具体命令如下:
ffmpeg -i 20210707.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 250k -an -movflags rtphint -bf 0 test6M.mp4;
在执行时,可以看到 rc 模式为 CBR 模式,
对应的 Bitrate View 截图如下,当用 cqp = 23 进行转码时,生成的码率大概如下:并且于原图进行对比,无论最大值、最小值、平均值都有了非常大的变化。同时发现波形分布基本上相同;
平均比特率–ABR
ABR 对应的类型为:X264_RC_ABR,也算 VBR 的一种;该值表示编码器会根据视频采集内容的复杂度(实际上是帧间变化量、运动情况)动态调整输出码率,图像复杂则码率高,图像简单则码率低,码率会波动比较大。该模式在输出码率时有一定的波动:对于静止画面,压缩后的码率会非常低;而对于小幅度运动场景,可能会有方块效应,这时画面质量逐渐变差,码率也会上升;但是对于剧烈晃动,比如连续挥手测试,则出现严重马赛克。
相同的视频,用 ABR 模式转码,实例截图如下:
ffmpeg -i 20210707.mp4 -c:v libx264 -b:v 6000k test_dr_6m.mp4
对应的 Bitrate View 截图如下,大概码率设置为 6Mbps,
如果按照 CBR 进行转码,则波形就差异比较多了:
ffmpeg -i 20210707.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 250k -an -movflags rtphint -bf 0 test6M.mp4
恒定质量因子–CRF
CRF 对应的类型:X264_RC_CRF;该模式是一种编码模式,可以向上或向下调整文件数据速率以达到选定的质量级别,而不是特定的数据速率。如果要保持最佳质量,而又不怎么担心文件大小,这时候就可以使用 CRF 速率控制模式。CRF 编码适用于存档或生成用于上传和转码的夹层文件。但是,从可交付性的角度来看,它不是最理想的,因为在对文件进行编码之前,不知道将产生的数据速率。
进行 crf 转码的命令行如下:
ffmpeg -i 20210707.mp4 -c:v libx264 -b:v 6000k -crf 23 test_crf23_6M.mp4
计划
要理清码率控制相关内容,需要准备比较多的知识,比如 RDO,比如 VBV,比如量化参数;以及对于编码的深度理解。我们会分几次分别对相关内容进行讲解,依次拨开码率控制的面纱。当原理讲解清楚后,会从实战方向,说明具体参数对于网络传输的影响,以及如何进行优化以期达到理想的效果。
作者:Fenngtun | 来源:公众号 —— MediaStack
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。