FFmpeg使用的实际线程数与我使用-threads参数传递的线程数不一致。
我已经在我的MacBook Air和我的VM上运行了测试,前者有4个内核,后者有2个内核。在两台机器上使用的线程数是一致的。
使用单线程会返回我所期望的结果:使用了一个线程。
$ 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)) + ... ]最终,我的问题是,为什么实际使用的线程数量与我指定的选项有很大的不同。
谢谢。
发布于 2016-12-07 13:33:44
简而言之-这些选项并不完全像你想的那样。
长长的答案如下:
FFmpeg总是有一个主线程来完成大部分的处理。在多个输入的情况下,还有用于多路复用的输入线程(每个输入一个线程);对于单输入,多路复用的多路复用在主线程上完成。
在输入上设置“线程N”(其中N> 1)可以启用多线程解码,这可以为每个支持它的解码器产生N个额外的线程。在你的例子中,视频解码器支持它,而音频解码器不支持,所以它是3个线程-1个主线程+2个用于视频解码的线程。
类似地,在输出上设置“线程N”可以启用多线程过滤和编码,这可以为每个filtergraph (我认为在旧的ffmpeg版本中是“每个过滤器最多N个线程”)和每个支持它的编码器产生N个额外的线程。还有一个重要的警告-这只适用于通过x264进行线程管理的编码器;libx264不这样做-它将请求的线程计数转发到ffmpeg库,后者进行自己的线程管理。然后,x264可能会创建多达2*N个线程(确切的数量取决于许多编码参数)。因此,对于具有单个输出的“线程2”,您将获得1个主线程+2个用于定标器的线程+至少2个用于libx264的线程。这仍然不会增加你看到的num_outputs * (1 + num_threads)行为,我很有兴趣了解额外的线程来自哪里,但希望我的答案解释了为什么“线程2”选项不会将线程数增加2。
https://stackoverflow.com/questions/41006716
复制相似问题