gpt4 book ai didi

FFmpeg 在使用 -threads 时使用的线程比我预期的要多

转载 作者:行者123 更新时间:2023-12-04 14:40:49 25 4
gpt4 key购买 nike

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 个线程);对于单输入解复用是在主线程上完成的。

在输入上设置“线程 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。

关于FFmpeg 在使用 -threads 时使用的线程比我预期的要多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com