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 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。
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 使用建议
CQP 模式是把某个量化值作为目标,ABR 是把某个文件大小作为目标,而 CRF 则是把某个输出“视觉质量”作为目标。
3. 小结
码率控制属于视频编码的核心内容之一,简单的看几篇博客目前还只是停留在比较粗略的认识上,后续随着对视频编码理解的加深也会对码率控制有更多的认识。
参考
[1] x264码率控制方法介绍