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 内核被充分利用,我猜这意味着所有三个编码都并行运行。
我真的希望一些专家可以介入并帮助解决这个问题。
我自己已经注意到这一点,因为视频缓冲区大小较低/默认。
尝试将缓冲区大小增加到 50M 或文件大小的一半,以较小者为准。
另请注意,bufsize 参数以 k 为单位表示,因此它类似于 -bufsize 50000k
归档时间: |
|
查看次数: |
8490 次 |
最近记录: |