FFMPEG 多输出性能(单实例 vs 多实例)

sha*_*lin 5 video cpu performance ffmpeg x264

我正在从单个文件输入 (.mp4) 创建多个编码流。输入流没有音频。每个编码流都是通过裁剪输入的不同部分创建的,然后在 32 核系统上以相同的比特率进行编码。

这是我在 ffmpeg wiki 中解释的用于创建多个输出的场景。 https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs

场景 1(使用单个 ffmpeg 实例)

ffmpeg -i input.mp4 \

-filter:vcrop=iw/2:ih/2:0:0 -c:v libx264 -b:v 5M out_1.mp4 \

-filter:vcrop=iw/2:ih/2:iw/2:0 -c:v libx264 -b:v 5M out_2.mp4 \

-filter:vcrop=iw/2:ih/2:0:ih/2 -c:v libx264 -b:v 5M out_3.mp4

在这种情况下,我假设 ffmpeg 将仅对输入解码一次,并将其提供给所有裁剪过滤器。如果不正确,请纠正我。

Scenario2(使用多个 ffmpeg 实例,因此使用三个单独的进程)

ffmpeg -i input.mp4 -filter:vcrop=iw/2:ih/2:0:0 -c:v libx264 -b:v 5M out_1.mp4

ffmpeg -i input.mp4 -filter:vcrop=iw/2:ih/2:iw/2:0 -c:v libx264 -b:v 5M out_2.mp4

ffmpeg -i input.mp4 -filter:vcrop=iw/2:ih/2:0:ih/2 -c:v libx264 -b:v 5M out_3.mp4

就我而言,我实际上需要通过裁剪输入视频的不同部分来编码更多数量的流。我在这里展示三个只是为了让这个例子更简单。

现在,就 fps 性能而言,我认为场景 2 的性能更好。它还最大限度地使用 cpu(超过 95% 的 cpu 利用率)。场景 1 的 fps 较低,cpu 利用率低得多(接近 65%)。此外,在这种情况下,当我增加要编码的流数量时,cpu 利用率不会线性增加。当我从一个流变成两个时,它几乎变成了 1.5 倍。但在那之后,增量非常低(可能是 10% 甚至更少,更多的流)。

所以我的问题是: 我想使用单实例 ffmpeg,因为它避免了多次解码,而且因为我的输入可能与 4K 一样大甚至更大。我应该怎么做才能获得更好的 CPU 利用率(> 90%),从而获得更好的 fps?另外,为什么 cpu 利用率不随要编码的流数量线性增加?为什么单实例 ffmpeg 的性能不如多实例?在我看来,对于单个 ffmpeg 实例,所有编码都不是真正并行运行的。

编辑: 这是我可以重现和解释问题的最简单的方法,以防万一事情不是那么清楚。请记住,这仅用于实验目的以了解问题。

单实例:ffmpeg -y -i input.mp4 -c:v libx264 -x264opts threads=1 -b:v 1M -f null - -c:v libx264 -x264opts threads=1 -b:v 1M -f null - - c:v libx264 -x264opts 线程=1 -b:v 1M -f null -

多个实例:ffmpeg -y -i input.mp4 -c:v libx264 -x264opts threads=1 -b:v 1M -f null - | ffmpeg -y -i input.mp4 -c:v libx264 -x264opts 线程=1 -b:v 1M -f null - | ffmpeg -y -i input.mp4 -c:v libx264 -x264opts 线程=1 -b:v 1M -f null -

请注意,我将 x264 限制为单线程。在单个实例的情况下,我希望 ffmpeg 为每个 x264 编码生成 1 个编码线程并并行执行它们。但是我看到只有一个 cpu 核心被充分利用,这让我相信一次只有一个编码会话正在运行。另一方面,在多个实例的情况下,我看到三个 cpu 内核被充分利用,我猜这意味着所有三个编码都并行运行。

我真的希望一些专家可以介入并帮助解决这个问题。

Aku*_*urn 0

我自己已经注意到这一点,因为视频缓冲区大小较低/默认。

尝试将缓冲区大小增加到 50M 或文件大小的一半,以较小者为准。

另请注意,bufsize 参数以 k 为单位表示,因此它类似于 -bufsize 50000k