CRF指南(x264 和 x265 中的固定码率因子)

原文: https://slhck.info/video/2017/02/24/crf-guide.html
原文时间:2017.02.24
翻译时间:2019.02.01

CRF指南(x264 和 x265 中的固定码率因子)

      • 什么是固定码率因子?(Constant Rate Factor)
      • CRF vs. Constant QP
      • 为什么运动性很重要?
      • 关于视频质量指标
      • 视频质量和码率是怎么关联的?
      • 为什么电视或有线设备上还是有不清晰的块状伪影?

什么是固定码率因子?(Constant Rate Factor)

固定码率因子(CRF)是 x264 和 x265 编码器的默认质量(和码率控制)设置。取值范围是 0 到 51,这其中越低的值,结果质量越好,同时输出文件越大,越高的值意味着越高的压缩比,但你可能会在值大到某个点的时候注意到明显的质量损失。

对 x264,一般取值在 18 到 28 之间。默认值是 23,你可以先用它开始尝试。

ffmpeg 中,可以这样使用:

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

对 x265,默认CRF值是 28:

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4

如果你不确定设置CRF为多少,可以从默认值开始,根据你对输出文件的主观感觉进行调整。输出质量是否足够好了?不是?那就把CRF调低一点。输出文件太大了?那就选一个更高的CRF。尽管你的具体结果可能会有变化,大体来说CRF数值 +6 会使文件大小减半,-6 会使大小增一倍。

为了达到最优编码效果,你应该主要在离线文件存储中使用CRF编码。对其他的应用场景,这里推荐一些其他的码率控制模式。

在这里插入图片描述


CRF vs. Constant QP

相对于固定码率模式(CBR),CRF是一种“固定质量”编码模式。在获取固定质量的典型方法中,编码器会对每一个相同类型的视频帧用相同数据量进行压缩,意即丢弃相对相同的信息量。用技术名词来说,这维持了一个固定的QP(quantization parameter 量化参数),这个量化参数定义了一个指定区块的像素集合(宏块)会丢弃多少信息量。这通常会导致在整个视频序列中码率会有较大波动。

CRF模式比上述过程稍微精明一点,它会用不同的数据量来压缩不同视频帧,因此会根据需要改变QP值,来保持一个特定标准的感知质量。这是通过将视频内容的运动性考虑在内来实现的。以固定QP编码的编码器,当设置值为 18 时,不管帧内容如何(不同的帧类型之间会有很小的偏差,但在这可以忽略不计),QP 值会保持在 18。CRF模式下设置值为18 时,会对高运动性内容区提高QP到怎么说,20吧,然后再低运动性的视频序列中降低到 16 这样。这样的策略会对随时间变化的码率分配产生质变。

举个例子,这有一张(来自我另一篇文章的)图表,显示了分别在固定QP、CRF模式中使用不同数值(17,23)来编码两段视频时码率的变化情况:

CRF指南(x264 和 x265 中的固定码率因子)_第1张图片

CRF的码率线总是比CQP的码率线低;这意味着编码器能在节省带宽的同时保持一定的感知质量,然而用CQP的话,会浪费一些带宽。这个影响在例子里的第一段视频上表现尤为明显。

为什么运动性很重要?

人眼对静物会比它们在运动时观察到更多细节,因为这一点,视频编码器可以对移动画面应用更多压缩(丢掉更多细节),而对静态画面应用较少的压缩(保留细节)。

用外行的话来说,这是因为人的视觉系统会被事物的变化“分散”注意力,并且图像不会在屏幕上停留足够被观察到更多压缩痕迹的时间。从稍偏技术的角度来说,高运动性“掩盖”了像块状结构(译注:原文为blocking,后面所有该用词的原文均为 block 的类似变种,意思可参照后面的 wiki)这样的压缩伪影(Compression Artifact)。相对地,如果画面运动性不怎么强,会有更多时间观察图像,没有能分散你注意力或掩盖伪影的东西,你会希望这些画面尽可能地少被压缩。运动性较低时,压缩伪影会更明显(视觉呈现上),更碍眼。

你或许会问CQP模式是不是真的就没有更好的质量?不是的,两个模式的感知质量是一样的,但问题在于他对你真的不会注意到的视频内容区域,做不到足够的压缩,从而浪费数据空间。

实际上,很多人经常在 1-pass 编码中使用 CRF,并声称没有任何理由使用 CQP。另一个使用 CRF 更好的证明是:这是 x264 和 x265 开发者选择的默认码率控制模式。

关于视频质量指标

如果你只有一些对比视频序列质量的简单方法(例如 PSNR 这种基于每一帧信噪比的衡量方法),可能会得出 CRF 编码 比 CQP 质量更低的结论,但你作为一个人类的主观意见,会认为 CRF 下的编码结果和 CQP 下的版本质量一样或更好。它对你最在意细节的部分做了最少的压缩,在你最不在意细节的部分做了最多的压缩。这意味着虽然在客观标准下由 PSNR 值计算出的平均质量会稍低,但感知上的视频质量会较高。

这也是又一个反对使用 PSNR、SSIM 这样的简单指标去评价视频质量的证明——因为它们只关注独立的每一帧,就不能把像画面运动性这样的感知影响考虑在内。像 VQM、VMAF 这样更基于感知体验的指标体系对视频损耗的评价是更好的选择

视频质量和码率是怎么关联的?

不是所有的视频片段都同样“容易”被压缩。低运动性和渐变平滑的内容更易于压缩,而高运动性和大量空间细节的内容更依赖于编码器。这里“容易”或“困难”说的是,在相同码率下,一个容易编码的视频源会比较难编码的视频源有更好的感知质量。

CRF 模式有个问题:对不同的视频,不同的 CRF 值会产生不同的码率。(实际上,除非像YouTube那样对源视频掌握更多信息,你不能可靠地预估出指定了CRF值后最终码率是多少。)

比如说,如果 CRF 值设置为 23,可能对某个源视频,最终编码码率是 1500 kBit/s,但对另一个源视频是 1000 kBit/s。尽管他们看上去应该有着相同的质量。使用 CRF 模式,等于你想让编码器“为保留足够的内容细节而选择任何有必要的码率”。这不是一一对应的。

云编码服务 Bitmovin 会在实际编码前用 CRF 去衡量一个片段的内容复杂度。

注意如果你把 CRF 值设置太高——比如 30,在高运动性的画面中,你会看到有块状伪影出现,因为这部分内容的码率太容易过低了。编码器会对这些更为复杂的画面选用(比如说)32 的 QP 值,这对量化算子来说太重了(译注:这里太重了理解为值已经低到不能保留足够的画面细节)。正如文章开头说的,选择什么 CRF 值取决于你想要什么级别的视频质量。

为什么电视或有线设备上还是有不清晰的块状伪影?

为什么块状伪影会出现在有线或卫星广播内容中?甚至存在于在线视频流中?问题在于它们对某些部分的视频内容采用了过低的码率值。特别是电视广播中,使用固定码率来编码流媒体,没有留出空间来适配不同运动性级别的内容。因此,那些电视广播会因为所呈现的复杂内容需要比广播者所设定的更多的编码数据空间,而出现块状伪影。他们只会说“你就尽量保留更多细节,但不管内容多复杂,别让码率比这个点要高”。

现今的流媒体编码会表现得稍微更聪明些。YouTube 或 Netflex 使用了 2-pass 甚至 3-pass 算法,后者中,对给定源视频的一次 CRF 编码决定了后续进行 2-pass 编码时的最佳码率。这就能确保能有足够的码率来编码那些复杂场景的内容,同时也不会超过带宽要求。

可以从我另一篇文章中了解更多码率控制模式的内容


本文部分内容最初来自于 Handbrake 的官方文档,但现在已经被从那儿移除了。它也短暂地出现在了 Wikipedia 上,但也被移除了——和 Handbrake官方文档同源。这篇文章尝试恢复那些内容,并对一些地方进行了补充。不知道是否有哪些内容的原版文档存在,如果有的话,请告诉我。

更新:

  • March 2018 – 少量更新和说明。
  • April 2017 – 添加了来自另一篇文章的图片进行说明。
  • February 2017 - 根据一些相关开发者的建议进行重写,同时使文章结构更合理。

你可能感兴趣的:(Video,Codec)