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

FFmpeg使用的线程比使用-threads时预期的要多,ffmpeg,Ffmpeg,FFmpeg使用的实际线程数与我使用-threads参数传递的线程数不一致 我已经在我的MacBookAir上运行了测试,它有4个内核,还有一个VM有2个内核。两台机器上使用的线程数是一致的 使用单个线程将返回我期望的结果:使用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 /pr

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

我已经在我的MacBookAir上运行了测试,它有4个内核,还有一个VM有2个内核。两台机器上使用的线程数是一致的

使用单个线程将返回我期望的结果:使用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。这对我来说有些道理,因为输入将使用两个线程,而输出将使用一个线程

$ 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个)

如果使用
-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
超出
-线程2
的每个增量凹凸将使用额外的3个线程(例如
线程2
使用8个,
线程3
使用11个,
线程4
使用14个)

因此,似乎每当您使用
-threads 2
时,公式如下:

1 + [ (1 + (3 * output_n_threads)) + ... ]
最终我的问题是,为什么实际使用的线程数量与我指定的选项有很大差异


谢谢。

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

答案如下:

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

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

类似地,在输出上设置“threads N”可以启用多线程过滤和编码,这可以为每个filtergraph生成N个额外线程(我认为在较早的ffmpeg版本中,这是“每个过滤器最多N个线程”)还有一个重要的警告-这只适用于通过ffmpeg执行线程管理的编码器;libx264不执行此操作-它将请求的线程数转发给执行其自身线程管理的x264库。然后x264可能会创建多达2*N个线程(确切数量取决于许多编码参数)。因此,对于单输出的“线程2”,您将获得1个主线程+2个用于定标器的线程+至少2个用于libx264的线程。这仍然不等于
num_输出*(1+num_线程)
您正在看到的行为,我很想了解额外线程的来源,但希望我的回答能够解释为什么“线程2”选项不会将线程数增加2

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