我有上传脚本处理文件上传,然后调用exec(ffmpeg -i ......
我打电话给ffmpeg 3次。一个转换为mp4,一个转换为wemb,一个转换为缩略图。
问题是,如果调查员上传他的所有镜头,他不想坐在那里等待它转换,然后才能做其他事情。那么如何发送3个命令然后退出脚本呢?
我还想运行exec(rm -r / path / to / original)以便原始视频被删除,但显然我必须等待转换才能完成才能运行
答案 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 ::
这样的shellcriptsystem ("php converter.php \"$tempfile\" \"$mp4sound\" \"$webmsound\" &');
答案 1 :(得分:1)
不确定它是否有意义,我想的比你一次做的更好。 添加一点点改善背后的工作来缓解面前的痛苦
答案 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脚本。