我有一个监控摄像头和一个程序,当检测到运动时会记录视频。基本上,该程序以非常重的格式保存视频。
我的解决方案是调用一个使用 ffmpeg 转换视频的脚本。每次制作视频时都会调用该脚本。
转换花费的时间相对较短,但CPU使用量很大。当新视频到达需要转换而另一个视频的转换尚未完成时,就会出现问题。在这种情况下,再次调用该脚本,导致出现两个或多个 ffmpeg 进程,使机器在相当长的时间内几乎挂起。
如何对转换作业进行排队,以便在前一个转换作业完成后执行?我想要的是一次只有一个 ffmpeg 进程。
答案1
您可以使用batch
以下程序的一部分在包(作业排队工具)。它默认安装在许多系统上。
答案2
我将设置一个队列目录,并让后台进程遍历队列目录并生成 ffmpeg 转换。后台程序的示例可能是:
queue=/var/tmp/vidq
outdir=/var/tmp/videos
while true; do # do forever
for file in $queue/*; do
name=`basename $file`
mv -f $file $queue/.current
ffmpeg -i .current $outdir/$name
touch -r $queue/.current $outdir/$name
rm $queue/.current
done
sleep 300 # sleep for 5 minutes
done
您必须进行一些安全检查,例如排队的文件是否不是视频文件。并调整睡眠值。但这会生成具有相同名称和原始日期戳的转换后的文件。
另一种方法是检查文件锁,当 ffmpeg 进程退出时,锁将被删除,另一个进程可以启动,首先创建文件锁。然而,这意味着逻辑现在位于程序中,并且必须跟踪哪些文件需要处理。上面的队列目录解决方案意味着前端程序只需要将其传递到队列即可。