【问题标题】:FFmpeg is using more threads than I expect when using -threadsFFmpeg 在使用 -threads 时使用的线程比我预期的要多
【发布时间】:2017-04-21 18:17:39
【问题描述】:

FFmpeg 使用的实际线程数与我使用-threads 参数传递的数量不一致。

我已经在具有 4 个内核的 MacBook Air 和具有 2 个内核的 VM 上运行了测试。两台机器使用的线程数是一致的。

使用单个线程返回我期望的结果:使用了 1 个线程。

$ ffmpeg -threads 1 -i clip.mp4 -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4

$ cat /proc/$(pgrep ffmpeg)/status | grep Threads
Threads:        1

如果我在输入上设置 -threads 选项,它会将使用的线程数增加到 3。这对我来说有点意义,因为输入将使用 2 个线程,而输出将使用单个线程。

$ ffmpeg -threads 2 -i clip.mp4 -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4

$ cat /proc/$(pgrep ffmpeg)/status | grep Threads
Threads:        3

这就是我开始感到困惑的地方。如果相反,我将输入 -threads 保留为 1,并将输出 -threads 设置为 2,它使用 8 个线程(而不是我期望的 3 个)。

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4

cat /proc/$(pgrep ffmpeg)/status | grep Threads
Threads:        8

如果我用-threads 1 添加第二个输出,它不会增加使用的线程数。

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 \
                                -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 250k -vf scale=250:-2 -y clip-250.mp4

cat /proc/$(pgrep ffmpeg)/status | grep Threads
Threads:        8

但是,如果第二个输出也指定了两个线程,则线程数会跳到 15。

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 \
                                -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 250k -vf scale=250:-2 -y clip-250.mp4

cat /proc/$(pgrep ffmpeg)/status | grep Threads
Threads:        15

-threads 2 之外的每个增量提升都将使用额外的 3 个线程(例如,threads 2 使用 8,threads 3 使用 11,threads 4 使用 14。

因此,无论您何时使用-threads 2,公式似乎都类似于:

1 + [ (1 + (3 * output_n_threads)) + ... ]

最终我的问题是为什么实际使用的线程数与我指定的选项有很大不同。

谢谢。

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    简短的回答 - 这些选项并不完全符合您的想法。

    长答案如下:

    FFmpeg 总是有一个主线程来完成大部分处理。如果有多个输入,还有用于解复用的输入线程(每个输入 1 个线程);对于单输入解复用是在主线程上完成的。

    在输入上设置“线程 N”(其中 N > 1)启用多线程解码,这可以为每个支持它的解码器生成 N 个额外线程。在您的情况下,视频解码器支持它而音频解码器不支持,因此它是 3 个线程 - 1 个主线程 + 2 个用于视频解码的线程。

    同样,在输出上设置“线程 N”可以启用多线程过滤和编码,这可以为每个过滤器图生成 N 个额外的线程(我认为在旧的 ffmpeg 版本中,这是“每个过滤器最多 N 个线程”)和每个支持的编码器它。还有一个重要的警告——这只适用于通过 ffmpeg 进行线程管理的编码器; libx264 不这样做 - 它将请求的线程数转发给 x264 库,后者进行自己的线程管理。然后 x264 可能会创建多达 2*N 个线程(确切数量取决于许多编码参数)。因此,对于具有单输出的“线程 2”,您将获得 1 个主线程 + 2 个用于缩放器的线程 + 至少 2 个用于 libx264 的线程。这仍然不符合您所看到的num_outputs * (1 + num_threads) 行为,我有兴趣了解其他线程的来源,但希望我的回答能解释为什么“线程 2”选项不会将线程数增加 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-29
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多