首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用-threads时,FFmpeg使用的线程比我预期的要多

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

Stack Overflow用户
提问于 2016-12-07 07:17:45
回答 1查看 10.8K关注 0票数 14

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

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

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

代码语言:javascript
复制
$ 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个线程,而输出将使用单个线程。

代码语言:javascript
复制
$ 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个线程)。

代码语言:javascript
复制
$ 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添加第二个输出,它不会增加使用的线程数。

代码语言:javascript
复制
$ 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。

代码语言:javascript
复制
$ 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,公式都是这样的:

代码语言:javascript
复制
1 + [ (1 + (3 * output_n_threads)) + ... ]

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41006716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档