【发布时间】:2015-12-22 20:50:26
【问题描述】:
我正在创建一个简单的网络服务,它接受视频上传,对视频运行多种不同的编码(mp4、webm、ogv),然后将新创建的文件上传到我们的视频主机。
假设我有多个命令..
shell_exec('ffmpeg -i input.mp4 -f mp4 -c:v libx264 -preset slow -crf 24 -s 1280x720 -c:a libfdk_aac -profile:a aac_he -ar 22050 -b:a 64k -movflags +faststart output-1280x720.mp4');
shell_exec('ffmpeg -i input.mp4 -f mp4 -c:v libx264 -preset slow -crf 24 -s 1920x1080 -c:a libfdk_aac -profile:a aac_he -ar 22050 -b:a 64k -movflags +faststart output-1920x1080.mp4');
shell_exec('ffmpeg -i input.mp4 -f ogg -c:v libtheora -q:v 5 -s 1280x720 -c:a libvorbis -ar 22050 -b:a 64k -movflags +faststart output-1280x720.ogv');
shell_exec('ffmpeg -i input.mp4 -f ogg -c:v libtheora -q:v 5 -s 1920x1080 -c:a libvorbis -ar 22050 -b:a 64k -movflags +faststart output-1920x1080.ogv');
总之,我想...
- 立即打印响应:{success: true}
- 同步启动多个 ffmpeg 作业。
- 每个作业完成后,向另一台服务器发送一个 POST(每个 shell_exec 一个 POST)。
如果作业成功,只发送 POST 也很好,但我可以通过检查服务器上是否存在输出文件来轻松解决这个问题。
我知道我可以通过简单地将>/dev/null 2>/dev/null & 附加到每个命令来强制 shell_exec 在后台运行——这将允许我立即打印响应——但我认为这样做会导致所有并行运行的作业,而且由于这会转移输出,所以当作业完成时我没有得到任何真正的回调。
有什么想法吗??
【问题讨论】:
-
只是一个想法...如果您为每个命令创建一个新的 PHP 脚本,然后调用此脚本而不是直接运行该命令?在脚本结束时,您可以向服务器发送操作完成的通知。
-
您总是可以将该代码放在另一个 PHP 文件中,并使用 CURL 作为外部文件调用它,例如yourwebsite.com/api/apifilecall.php 在 CURL 中设置非常低的超时。附言您的第二行有三个单引号,这会破坏代码:)。
-
两个很好的建议。我要试一试。如果它有效,我会报告。
-
成功了,谢谢你的建议!
-
ogv 输出不需要
-movflags +faststart;它仅适用于 mov/mp4 多路复用器。考虑在 webm 中将 libvpx 用于 VP8/VP9 视频和 opus 音频,而不是旧的 graybeard theora。
标签: php asynchronous ffmpeg shell-exec