我正在尝试在多个文件的循环中执行ffmpeg
。我只希望一次运行一个实例,并且只使用50%的cpu。我一直在尝试cpulimit
,但它在循环中表现不佳。
for i in {1..9}; do cpulimit -l 50 -- ffmpeg <all the options>; done
这会同时生成所有九个作业,它们全部归init
所有,因此我必须打开htop
才能杀死它们。
for i in {1..9}; do ffmpeg <all the options> & cpulimit -p $! -l 50; done
这挂起,ctrl+c
继续下一个循环迭代。这些实例只能被SIGKILL
杀死。
答案 0 :(得分:3)
使用队列是可行的方法。我使用的简单解决方案是Task Spooler。您可以使用-threads
限制ffmpeg使用的核心数。这里有一些代码供您使用:
ts sh -c "ffmpeg -i INPUT.mp4 -threads 4 OUTPUT.mp4"
ts -S 1
ts
答案 1 :(得分:0)
如果希望-threads选项对编码器起作用,则应将其放在-i参数之后,输出文件名之前-您当前的选项仅告诉解码部分使用单个线程。因此,要使所有线程都使用一个线程,您需要在-i选项之前和之后都使用-threads 1。所以你可以这样:
ffmpeg -threads 1 -i INPUT.mp4 -threads 1 OUTPUT.mp4
答案 2 :(得分:0)
您应该在前台运行它。这样,循环将按预期工作。
$ cpulimit --help
...
-f --foreground launch target process in foreground and wait for it to exit
这对我有用。
for file in *.mp4; do
cpulimit -f -l 100 -- ffmpeg -i "$file" <your options>
done