x264 码率控制

1. 概述

在视频编解码过程中,我们一直在追求更低的码率和更高的编码质量。更低的码率意味着更低的带宽占用和更小的文件体积,但往往意味着更低的视频质量。所以我们会根据应用场景和视频复杂度,选择恰当的视频编码码率以及其他控制参数。对于 x264 而言,共有三种码率控制模式,接下来进行介绍。

2. 码率控制的三种模式

2.1 恒定量化参数模式

X264_RC_CQP constant quantizer parameter

取值范围:[0, 51],0 = lossless

最简单的码率控制方式,每帧图像都按照这一个特定的 QP 来编码,每帧编码后的数据量有多大是未知的。参数 i_qp_constant 设置的是 P 帧的 QP,I、B 帧的 QP 根据 f_ip_factor,f_pb_factor 计算得到。

每种帧类型的量化参数设置位于 x264/encoder/encoder.c 中,具体代码:
x264 码率控制X264 YUV420 格式 8 比特采样的 QP 范围是 [0, 51],QP 值越小,编码视觉质量越好。0 代表无损编码。

在研究编码算法时,一般会选用 CQP 方法,设定 QP 值为 24,28,32,40 等,编码得到 RD 曲线,然后比较算法优劣。

相同视觉质量时,CQP 编码输出的文件会比 CRF 模式更大,一般而言 CRF 都能替代 CQP 方法,不过 CQP 方法因为完全不需要预测所以运行更加快。

帧的重要级别:IDR 帧 > I 帧 > P 帧 > 做参考的 B 帧 > 不做参考的 B 帧。QP 值可以随着帧的重要级别降低而增大。

i_qp_min
默认值:0. 定义 x264 可以使用的最小量化参数值。量化参数值越小,输出的视频质量越好。
当 QP 小于某一个值后,编码输出的宏块质量与原始块极为相近,这时没有必要继续降低 QP。
如果开启了自适应量化器(默认开启),不建议提高 i_qp_min 的值,因为这样会降低平滑背景区域的视觉质量。

i_qp_max
默认值:51. 定义 x264 可以使用的最大量化值。默认值 51 是 h264 规格中可供使用的最大值。

i_qp_min 和 i_qp_max 在 CRF 和 ABR 方法下是有效的,将 i_qp_max 设置过小,可能导致 ABR 码率控制失败,不建议调整这个参数。

i_qp_step
默认值:4. 设置两帧间量化值的最大变化幅度。
帧间 QP 变化,帧内宏块 QP 不变,输出码率未知,各帧输出的视觉质量有变化。

2.2 恒定码率系数模式

X264_RC_CRF constant rate-factor

这种控制模式在控制所有视频帧的质量上有很好的效果,但是无法有效地控制码率。

这种码率控制模式是 x264 采用的默认码率控制模式,f_rf_constant 默认值取 23。
x264 码率控制
CRF 可以提供和 CQP 一样的视觉质量,但是文件更小,CRF 通过降低那些“less important”的帧的质量来达到这个目的。

“less important”指那些过于耗费码率但是又难以用肉眼察觉的帧,比如复杂或者告诉运行的场景,省下来的码率分配给其他更有效的帧。

在 x264 编码器内部 CRF 和 ABR 采用了相同的调整策略,只是它不遵循一个特定的输出码率。

它也是通过改变不同重要级别帧(I、P、B),以及帧内不同宏块类型(高速运动、复杂纹理、平坦区域)的 QP 值,以此来调整输出的视觉质量。

和 QP 的范围一样 RF 的范围也是 [0, 51]。其中 0 对应无损模式, 51 质量最差。RF 值加 6,输出码率大概减少一半。

从主观上讲,18~28 是一个合理的范围, 18 往往被认为从视觉上看是近似无损的。
帧间 RF 变化,帧内宏块 RF 变化,输出码率未知,各帧输出视觉质量基本恒定。

2.3 恒定平均码率模式

X264_RC_ABR average bitrate

参数设置的量纲为 kilobits/sec。X264 中的 1k 是 1000,而不是 1024.

恒定比特率模式意味着最终文件的大小是可知的,但是目标文件的质量不可知。X264 会试图让最终文件的整体码率与给定的码率相等。

与 ABR 模式相应的有 CBR 和 VBR 。
CBR 编码码率基本保持恒定,有利于流式播放。
CBR 的缺点在于复杂场景码率不够用,简单场景码率浪费,因此编码内容的视觉质量不稳定。通常在比较低的比特率下,这种质量变化会更加明显。

VBR 为简单场景分配较大的 QP,为复杂场景分配较小的 QP,得到基本稳定的输出视觉质量。
相较于 CBR ,在同样文件大小的条件下,VBR 的输出结果要比 CBR 好很多,有利于媒体的下载和本地存储。
VBR 的缺点在于输出码流的大小不可控,同时对于复杂度恒定的内容没什么优势。

ABR 编码为简单场景分配较少的比特,从而留出足够的比特用于生成高质量的复杂部分。使得有限的比特数能够在不同的场景间合理分配。这一点类似于 VBR。
同时 ABR 分配码率,使得在一定时间内,平均码率趋近于目标码率,这样可以控制输出文件的大小。这一点类似于 CBR。
因此,可以认为 ABR 是一种 VBR 和 CBR 的折中方案。

对比结果

模式 视觉质量稳定性 即时输出码率 输出文件大小
CBR 不稳定 恒定 可控
VBR 稳定 变化 不可控
ABR 基本稳定 变化 可控

2.4 使用建议

x264 码率控制
CQP 模式是把某个量化值作为目标,ABR 是把某个文件大小作为目标,而 CRF 则是把某个输出“视觉质量”作为目标。

3. 小结

码率控制属于视频编码的核心内容之一,简单的看几篇博客目前还只是停留在比较粗略的认识上,后续随着对视频编码理解的加深也会对码率控制有更多的认识。

参考

[1] x264码率控制方法介绍