了解速率控制模式Rate Control Mode-CBR,VBR,CRF(x264x265vpx)

Posted 木大白易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解速率控制模式Rate Control Mode-CBR,VBR,CRF(x264x265vpx)相关的知识,希望对你有一定的参考价值。

声明:本文为Understanding Rate Control Modes (x264, x265, vpx)的译文。

什么是“速率控制”?这是视频编码器在决定为给定帧花费多少比特时所做的事情。(有损)视频编码的目标是尽可能多地保存比特,减少原始输入文件的文件大小,同时保持尽可能多的质量。速率控制是确定尺寸和质量之间权衡的关键步骤

速率控制有多种形式——你会认识术语“1-pass”和“2-pass”、“CBR”和“VBR”,也许你知道“VBV Encoding”或“CRF”。

你为什么需要关心?您经常会看到应用错误类型的速率控制模式或错误比特率的视频编码命令示例。这篇文章是关于不同模式的简要指南;它解释了您作为最终用户何时使用哪个。请注意,这与速率失真优化的细节无关。

前言:可变比特率与恒定比特率

许多人更熟悉音频编码器中的速率控制,尤其是那些像我一样从 MP3 成长起来的人。为了翻录我们的 CD,我们一直在使用恒定比特率 (CBR) 编码,后来出现了可变比特率 (VBR) 编码。可变比特率可确保您在给定约束(由 VBR 质量级别设置)下以尽可能高的质量来获得尽可能低的文件大小。

简而言之,VBR 让编码器可以为“难以编码的内容”使用更多位,并为文件中易于压缩的部分节省位。压缩方面的困难和容易点是什么?例如,视频中的大量运动需要更多位进行编码,因为相邻视频帧之间的差异会更大。高空间细节和复杂纹理也难以编码。

你的编码方案是什么?

选择速率控制模式很大程度上取决于您的用例。一般来说,有许多不同的场景都会影响您设计编码管道的方式:

  1. 存档- 您想要压缩文件以将其存储在文件中,例如在外部硬盘驱动器或网络存储中。该文件应该以尽可能小的文件大小具有尽可能好的质量,但您并不关心确切的大小。
  2. 流式传输— 您希望使用典型的视频点播 (VoD) 流式传输解决方案(例如 HTTP 渐进式下载或 HTTP 自适应流式传输)通过 Internet 发送文件。您需要确保文件不超过某个比特率,或者您需要以不同的标称比特率提供同一文件的不同表示(对于自适应流)
  3. 实时流式传输- 与 2. 类似,但您希望尽可能快地完成编码,并且您事先对内容一无所知。
  4. 设备编码——你想把你的文件放在 DVD、蓝光等上。您要确保文件最终具有一定的大小。

了解场景有助于您选择速率控制模式。

速率控制模式

现在,让我们深入了解不同的模式。我的帖子将基于流行的 H.264 和 H.265 编码器x264和x265以及libvpx支持的在ffmpeg中可用的模式。

对于 x265,您可能必须使用--enable-libx265编译ffmpeg. 使用x265,并不是所有的参数都可以直接传递,所以必须使用-x265-params选项。对于 libvpx,ffmpeg 需要使用--enable-libvpx编译.

提醒一句:默认情况下,像 x264 这样的编码器默认不会不必要地用比特“填充”帧。这意味着,如果您有一个非常容易编码的场景,您的比特率可能总是低于您指定的比特率。不要担心这一点——只要记住,如果它是浪费的,那么实现精确的目标比特率是没有意义的。

恒定Constant QP (CQP)

量化参数(Quantization Parameter)控制帧中每个宏块的压缩量。较大的值意味着将有更高的量化、更多的压缩和更低的质量。较低的值意味着相反。在 H.264 中 QP 范围从 0 到 51,您可以轻松地为您的整个使用 x264 和 x265的编码过程设置一个固定的 QP。注意:libvpx 没有固定的 QP 模式。

ffmpeg -i <input> -c:v libx264 -qp 23 <output>
ffmpeg -i <input> -c:v libx265 -x265-params qp=23 <output>

除非您知道自己在做什么并且明确想要这样做,否则建议不要使用此模式!设置固定的 QP 意味着生成的比特率将根据每个场景的复杂性而发生很大变化,这将导致输入视频的编码效率相当低。如果您设置足够低的 QP,质量会很好,但与 CRF(见下文)相比,您可能会浪费空间,或者您无法控制实际比特率。

适合:视频编码研究,或者如果您没有 CRF 模式
不适合:几乎其他任何东西

请注意,Netflix 建议使用固定 QP 编码进行每次镜头编码优化,以实现每个场景的最佳编码。然而,这需要对各个编码镜头进行大量处理和仔细组装,因此除非您实现了整个框架,否则它不是您应该使用的“一刀切”的方法。

平均比特率Average Bitrate(ABR,也称为“目标比特率”)

在这里,我们给编码器一个目标比特率,并期望它弄清楚如何达到该比特率:

ffmpeg -i <input> -c:v libx264 -b:v 1M <output>
ffmpeg -i <input> -c:v libx265 -b:v 1M <output>
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M <output>

避免使用此模式!一位主要的 x264 开发人员自己说您永远不应该使用它。为什么?由于编码器不能及时准确地知道前面的内容,它必须猜测如何达到该比特率。这意味着速率本身会有所不同,尤其是在剪辑的开头,并在某个时间点达到目标。特别是对于 HAS 类型的流媒体,这会导致短片段内的巨大质量变化。

不是恒定比特率模式!虽然 ABR 在技术上是一种 VBR 模式,但它并不比指定恒定比特率好多少,因为它不能可靠地提供良好的质量。

适合:快速(和脏)编码
不适合:几乎任何东西

恒定比特率Constant Bitrate (CBR)

如果这是您的用例的要求,您可以强制编码器始终使用某个比特率。即使不需要,比特率也将始终(大致)相同。您可以通过设置nal-hrd选项为 x264 启用它:

ffmpeg -i <input> -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M <output>

输出文件必须是.ts(MPEG-2 TS),因为 MP4 不支持 NAL 填充。请注意,如果您的资源易于编码,此模式会浪费带宽,但它可以确保比特率在整个流中保持恒定。在某些应用程序中使用此模式可能有意义,但您通常希望尽可能允许流使用较低的比特率。

对于 VP9,你需要这个:

ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -minrate 1M <output>

适合:保持恒定的比特率(duh);视频流(例如Twitch)
不适合:存档;有效利用带宽

2-Pass 平均比特率(2-Pass ABR)

允许编码器进行两次(或更多次)通过使其能够及时估计前方的内容。它可以计算在第一遍中对帧进行编码的成本,然后在第二遍中更有效地使用可用比特。这确保了输出质量在一定的比特率约束下是最好的。这也意味着比特率会随着时间的推移而有所变化,这就是为什么这种模式也可以称为可变比特率 (VBR),尽管这有点含糊不清。

为 x264 启用它:

ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 2 <output>.mp4

对于 x265,替换libx264为libx265并在私有选项字段中设置 pass 选项:

ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=1 -f null /dev/null
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=2 <output>.mp4

对于 VP9,就像 x264:

ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -pass 2 <output>.webm

这是对文件进行流式编码的最简单方法。有两个警告:您不知道最终的质量是什么,因此您必须进行一些测试以确保您的比特率实际上对于某些复杂的内容足够高。此模式的另一个缺点是比特率可能会出现局部峰值,这意味着您发送的数据可能比您的客户端接收的多。

适用于:达到一定的目标码率;设备编码
不适合:如果您需要快速编码(例如,直播)

恒定质量Constant Quality (CQ) / 恒定速率因子Constant Rate Factor (CRF)

我在另一篇文章中更详细地讨论了恒定速率因子。它基本上可以在整个编码过程中为您提供恒定的质量。这是一个“一劳永逸”的事情——只需指定 CRF,然后让编码器完成剩下的工作。

ffmpeg -i <input> -c:v libx264 -crf 23 <output>
ffmpeg -i <input> -c:v libx265 -crf 28 <output>
ffmpeg -i <input> -c:v libvpx-vp9 -crf 30 -b:v 0 <output>

在 H.264 和 H.265 中,CRF 的范围从 0 到 51(和 QP类似)。23 是 x264 的一个很好的默认值,而 28 是 x265 的默认值。18(或 x265 为 24)应该在视觉上是透明的;任何更低的值可能只会浪费文件大小。±6 的值将导致大约为原始比特率的一半或两倍。对于 VP9,CRF 可以是从 0 到 63。推荐值是从 15 到 35。

此模式的唯一缺点是您不知道生成的文件大小或比特率的波动。

请注意,具有相同结果比特率的 2-passCRF 编码在质量上应该相同。主要区别在于,使用2-pass,您可以控制文件大小(如果需要),而使用 CRF,您只需指定所需的质量。

适合:档案;实现最佳质量
不利于:流媒体;获得确定的比特率/文件大小

约束编码Constrained Encoding (VBV)

Video Buffering Verifier提供了一种方法来确保将比特率限制在某个最大值。这对于流式传输很有用,因为您现在可以确定在特定时间范围内您不会发送比您承诺的更多的比特。VBV 既可以与 2-pass VBR 一起使用(在两遍中都使用它),也可以与 CRF 编码一起使用——它可以“添加”到已经呈现的速率控制模式中。后一种模式也称为“capped CRF”。

使用-maxrate-bufsize选项打开 VBV以设置最大比特率和预期的客户端缓冲区大小:

ffmpeg -i <input> -c:v libx264 -crf 23 -maxrate 1M -bufsize 2M <output>
ffmpeg -i <input> -c:v libx265 -crf 28 -x265-params vbv-maxrate=1000:vbv-bufsize=2000 <output>

VP9也有类似的模式,不叫VBV,但背后的思路是一样的:

ffmpeg -i <input> -c:v libvpx-vp9 -crf 30 -b:v 2M <output>

注意:如果您为实时流媒体应用程序执行此操作并且想要加快编码过程,对于x264和x265可以添加-tune zerolatency-preset ultrafast选项。它们会降低您在特定比特率下获得的质量(即压缩效率),但会显着加快处理速度。对于libvpx-vp9,您要设置-quality realtime-speed 5。有关详细信息,请参阅H.264VP9 指南。

要将此方法与受约束的 ABR-VBV 编码一起使用:

ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>

对于 x265:

ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f null /dev/null
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000 <output>

对于 VP9:

ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>

注意:这里也可以使用 one-pass 方法,根据 x264 开发人员的说法,这通常与两次 pass 一样好,但它不会有效地压缩剪辑。

你应该如何设置bufsize?这取决于您希望比特率有多少可变性。一个好的默认值是缓冲区大小是最大速率的两倍,但建议可能会因流设置而异。如果您的客户端缓冲区较小(大约几秒钟),则您的 bufsize 应该与 maxrate 大小相同。如果要限制流的比特率,请尝试将 bufsize 设置为最大速率的一半或更小。

当您将 VBV 应用于 CRF 编码时,诀窍是找到一个 CRF 值,该值平均会产生您想要的最大比特率,但不会更多。如果你的编码总是“最大化”你的最大比特率,你的 CRF 可能设置得太低了。在这种情况下,编码器会尝试使用它没有的比特。另一方面,如果您的 CRF 较高,使得比特率并不总是达到最大值,您仍然可以降低它以获得一些质量。例如,您在没有VBV 的情况下以 CRF 18 进行编码。您的剪辑最终以 3.0 Mbit/s 的平均比特率结束。但是您希望您的 VBV 设置将剪辑限制在 1.5 Mbit/s,因此您需要将 CRF 增加到大约 24 才能仅获得一半的比特率。

适合:在带宽限制下进行流式传输;直播(使用 CRF,1-pass);VoD 流媒体(目标比特率,2-pass)
不适合:想玩的人;档案

比较示例

这是不同速率控制算法之间的快速比较。我拍摄了免费的Big Buck Bunny和Tears of Steel视频序列,并分别选择了三个不同的部分(长度为 30 秒)。请注意,这些序列是未压缩的原始素材。然后使用libx264和其默认设置对视频进行编码。唯一不同的是不同的速率控制模式。我设置了不同的目标比特率(750、1500、3000、7500 kbit/s)和最大速率(对于 VBV)和 QP/CRF 值(17、23、29、35)。您可以在 GitHub 上找到用于比较的脚本

请注意,这种比较绝不是详尽的或完全具有代表性的。通常,您想尝试各种流派的许多不同序列以及不同的编码器。我计划在不久的将来更新这些测试。尽管如此,这些测试应该让您了解不同模式的作用。

让我们从不同的比特率控制模式开始。左栏是 3000 kbit/s,右栏是 7500 kbit/s。我排除了其他目标比特率,因为它们在图表中没有显示出很大的差异,因为比特率已经处于如此低的点,以至于编码器在如何分配它方面没有太多选择。这些行是来自 Big Buck Bunny (BBB) 和 Tears of Steel (ToS) 的不同剪辑。这条线表示单个帧大小上的 LOESS 平滑 - 它指示比特率如何随着剪辑的持续时间而变化。

您可以看到——尤其是前四个内容——ABR(绿松石线)和 ABR+VBV(紫色)错误地估计了剪辑的复杂性。事实上,Big Buck Bunny 序列以淡入、平滑渐变和低运动开始,这意味着不需要太多比特即可以足够好的质量对其进行压缩。2-pass 方法正确地以较低的比特率开始并节省带宽。视频剪辑的最后三分之一包含大量空间细节,这使得 2-pass 模式使用了它在开始时保存的更多位。

对于第二个 Big Buck Bunny 剪辑,不同的编码模式实际上比预期更好地对齐,尽管再次可见 2-pass 如何导致比特率的变化比其他模式更极端。

当然,也有一些剪辑非常容易编码(或者复杂度变化不大)。在这里,速率控制模式差别不大。

对于基于质量的模式(CQP 和 CRF),我只显示 CRF/QP 17 和 23 的结果,它们处于质量范围的“好”端(就像 3000 和 7500 kbit/s 是“好”的值,对于全高清视频来说)。曲线的顺序是相反的——越低意味着质量越好:

在这里,可以看到与 2-pass 相同的趋势:比特率遵循内容复杂性。但是,使用 CRF,它受到更多限制,可以在不需要的地方节省位。最有趣的例子是左下角:CRF恒定 QP 节省比特率,就像它通常所做的那样,但它是在恒定偏移量中这样做的。我不得不猜测为什么会这样——也许这篇文章会更新一些进一步的分析。

一般来说,我们可以看到 CRF 方法如何很好地匹配内容,只要我们能事先知道得到的平均比特率是多少……这就是 CRF+VBV 发挥作用的地方:

为给定的 CRF 选择正确的目标/最大比特率通常是猜测,并且完全取决于源视频。但是,如果正确完成,您不会过多地限制质量,将其推到极限(如 3000 kbit/s 和 CRF 17 的情况)。您也不想让比特率变化太大。CRF 23 是 libx264 的默认设置,您可以看到,在给定适当的目标比特率设置(如 7500 kbit/s)的情况下,这种编码模式将使比特率变化到足以解决内容复杂性的差异,同时仍保持对 VBV 的合规性模型。

总结

理解不同的速率控制模式并不容易。不幸的是,最简单的解决方案(仅指定比特率)根本不推荐使用,但 Web 一直在使用这种方法传播代码示例。

总而言之,根据您的用例,您应该执行以下操作:

  • 档案——CRF,能为您提供所需的质量。
  • 流式传输- 具有包含 VBV 比特率的 two-pass CRF 或者ABR。
  • 实时流媒体——具有包含 VBV 比特率的 one-pass CRF 或者ABR。或者如果你可以浪费比特,使用CBR。
  • 设备编码——通常是two-pass ABR。

更多阅读材料:

Handbrake Wiki:恒定质量与平均比特率
H.264 Excellence 的视频编码设置
x264的速率控制方法的定性概述
谷歌:详细介绍 VP9 比特率模式

以上是关于了解速率控制模式Rate Control Mode-CBR,VBR,CRF(x264x265vpx)的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 限制访问速率

视频编码中的RC(rate control)是什么?码率控制 CBR (Constant Bit Rate)VBR (Variable Bit Rate)

视频编码中的RC(rate control)是什么?码率控制 CBR (Constant Bit Rate)VBR (Variable Bit Rate)

了解速率控制模式:什么是 CBRVBRCRF和Capped-CRF?

了解速率控制模式:什么是 CBRVBRCRF和Capped-CRF?

MIPI video mode 和 command mode 的区别