【发布时间】: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