通过PHP调用ffmpeg,但不要等待它

时间:2011-10-03 07:51:03

标签: php ffmpeg

我有上传脚本处理文件上传,然后调用exec(ffmpeg -i ......

我打电话给ffmpeg 3次。一个转换为mp4,一个转换为wemb,一个转换为缩略图。

问题是,如果调查员上传他的所有镜头,他不想坐在那里等待它转换,然后才能做其他事情。那么如何发送3个命令然后退出脚本呢?

我还想运行exec(rm -r / path / to / original)以便原始视频被删除,但显然我必须等待转换才能完成才能运行

5 个答案:

答案 0 :(得分:5)

您可以在命令后使用&符号在后台运行它并立即返回提示符(控件)。

我建议创建一个bash脚本,如:

#!/bin/sh
ffmpeg -i $1 -ab 64k -vb 420k $1.mp4
ffmpeg -i $1 -ab 64k -vb 420k $1.webm

然后从php运行它,如:

system ('myscript.sh tempfile &');

以下示例使用if结构来决定是使用声音还是不使用声音。第一个参数是文件名,如果第二个等于0,那么mp4上没有声音,如果第三个参数为零,那么webm上没有声音。

#!/bin/sh
if [ $2 -eq 0 ]
then
    ffmpeg -i $1 -an -vb 420k $1.mp4
else
    ffmpeg -i $1 -ab 64k -vb 420k $1.mp4
fi


if [ $3 -eq 0 ]
then
    ffmpeg -i $1 -an -vb 420k $1.webm
else
    ffmpeg -i $1 -ab 64k -vb 420k $1.webm
fi

你可以在PHP中使用它,如:

system ('myscript.sh ' . $tempfile . ' ' . (0 + $mp4sound) . ' ' . (0 + $webmsound) . ' &');

...但请记住,您甚至可以启动PHP文件而不是像shell ::

这样的shellcript
system ("php converter.php \"$tempfile\" \"$mp4sound\" \"$webmsound\" &');

答案 1 :(得分:1)

  • 单独处理文件上传和转换
  • 上传文件后
  • 将其放入作业队列
  • 运行一个cron作业,每分钟检查一次最新队列+如果当前处理作业已完成,如果是,则执行转换。
  • 转换后,请取消链接(/ path / to / original)以删除原始视频
  • 更新作业状态

不确定它是否有意义,我想的比你一次做的更好。 添加一点点改善背后的工作来缓解面前的痛苦

答案 2 :(得分:1)

尝试在一个页面中单独处理所有ffmpeg转换。例如:convert.php

上传完成后。发送隐藏请求到convert.php?id = someid

在convert.php的顶部使用ignore_user_abort(TRUE); 即使用户关闭浏览器,该过程也会运行。 如果用户未关闭该页面仍然在该页面中具有ajax响应更新状态。

我希望能有所帮助。

答案 3 :(得分:0)

也许您可以将执行转换的代码移动到由cron作业调用的脚本中。

例如,用户可以将视频上传到目录,也可以将记录插入包含所有未转换视频的数据库表中。

然后,每隔x分钟运行一次cron作业,检查数据库中是否有未转换的视频,然后转换它们。完成后,脚本可以删除原始视频并从数据库中删除该行。

答案 4 :(得分:0)

如果你在Linux上运行,exec()中的命令的跟踪符号 - 调用将在后台启动该进程。

您可能还想将输出从ffmpeg重定向到/ dev / null

ffmpeg -i (...)  > /dev/null 2>&1 &

如果您想在转换后进行清理,可以使用相同的方法调用shell脚本。