【发布时间】:2012-09-23 18:17:18
【问题描述】:
我试图在我的服务器上编码许多视频,但 FFMPEG 是资源密集型的,所以我想设置某种形式的队列。我网站的其余部分使用 PHP,但我不知道是否应该使用 PHP、Python、BASH 等。我想我可能需要使用 CRON,但我不确定如何告诉 ffmpeg 启动一个新任务(从列表中)完成之前的任务后。
【问题讨论】:
标签: bash cron ffmpeg queue batch-processing
我试图在我的服务器上编码许多视频,但 FFMPEG 是资源密集型的,所以我想设置某种形式的队列。我网站的其余部分使用 PHP,但我不知道是否应该使用 PHP、Python、BASH 等。我想我可能需要使用 CRON,但我不确定如何告诉 ffmpeg 启动一个新任务(从列表中)完成之前的任务后。
【问题讨论】:
标签: bash cron ffmpeg queue batch-processing
我们将在 bash 脚本中使用FIFO(先进先出)。该脚本需要在cron(或任何脚本,任何调用FIFO的终端)之前运行,以向该脚本发送ffmpeg命令:
#!/bin/bash
pipe=/tmp/ffmpeg
trap "rm -f $pipe" EXIT
# creating the FIFO
[[ -p $pipe ]] || mkfifo $pipe
while true; do
# can't just use "while read line" if we
# want this script to continue running.
read line < $pipe
# now implementing a bit of security,
# feel free to improve it.
# we ensure that the command is a ffmpeg one.
[[ $line =~ ^ffmpeg ]] && bash <<< "$line"
done
现在(当脚本运行时),我们可以使用以下语法将任何ffmpeg 命令发送到命名管道:
echo "ffmpeg -version" > /tmp/ffmpeg
并带有错误检查:
if [[ -p /tmp/ffmpeg ]]; then
echo "ffmpeg -version" > /tmp/ffmpeg
else
echo >&2 "ffmpeg FIFO isn't open :/"
fi
他们会自动排队。
【讨论】:
谢谢你。正是应用这种技术来创建一个 ffmpeg 队列。 不过我做了1个小改动。由于某种原因,此队列仅适用于 2 个项目。当第一个项目完成时,我只能发送第三个项目。
我相应地修改了脚本:
while true; do
# added tweak to fix hang
exec 3<> $pipe
# can't just use "while read line" if we
# want this script to continue running.
read line < $pipe
我基于: https://stackoverflow.com/questions/15376562/cant-write-to-named-pipe
只是想我应该分享这个以备将来使用。
【讨论】: