php - FFMPEG 后台任务完成后运行脚本(通过 PHP)

标签 php video ffmpeg background

我有一个 PHP 脚本,它通过 shell_exec() 触发 FFMPEG 文件转换.

shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 >/dev/null 2>/dev/null &');

这发生在后台(因此 & ),即脚本在转换完成之前完成。

转换完成后,有没有办法调用和执行 PHP 脚本(更新数据库标志)?

我已经做了很多谷歌搜索,但我对服务器命令的了解还不足以理解我正在阅读的内容(例如 this answer )。我能做到的最好的是将标准输出重定向到一个文件
shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null &');

...但显然这只是创建和写入文件,它不会通过 PHP 调用和执行它。

最佳答案

我对服务器命令也不是很擅长,所以我无法真正帮助你。但我确实有解决问题的诀窍。

所以我看到了一些你可以做到这一点的方法,基本上你需要 PHP 在命令行调用完成时做一些事情。显而易见的答案是删除 &关闭命令的末尾并使其阻塞,以便 PHP 坚持告诉工作完成。但是在这样做之前,您无法返回给最终用户。

选项 1
因此,解决此问题的一种方法是制作一种称为非阻塞的 Bootstrap PHP 脚本。在此脚本中执行您现在的阻塞转换命令,然后返回让 PHP 执行其他操作。

 //bootstrap.php
 shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null'); //blocking
 //Update the DB

然后从您的 Controller 或您所说的 Bootstrap 非阻塞
shell_exec('php {pathto}/bootstrap.php 2>/dev/null &');

这样,对 Bootstrap 的调用立即返回,但转换调用被阻塞,这使您有机会更新数据库后记。

选项 2

因为转换是输出一个文件,你可以启动一个单独的后台作业,监控输出文件的修改时间。然后,如果修改时间是过去一分钟,您可以假设它已完成转换和更新数据库。只要将数据添加到文件中,修改的时间就应该继续更新。

希望有帮助。

PS。我有一些代码你可能在 GitHub 上很有用

在 Windows 和 linux 中运行后台进程

https://github.com/ArtisticPhoenix/MISC/blob/master/BgProcess.php

PHP进程锁定(使用文件的Mutex模拟)

https://github.com/ArtisticPhoenix/MISC/blob/master/ProcLock.php

PHP 程序的命令行参数映射:

https://github.com/ArtisticPhoenix/Cli

如果对您有帮助,欢迎您使用它们。

关于php - FFMPEG 后台任务完成后运行脚本(通过 PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231861/

相关文章:

php - Laravel 分页资源不会添加元

php - shell_exec return null - 监控linux服务

iphone - iPhone 支持的视频文件格式

c# - 使用NReco视频转换器,Format.flv引用无法解决

audio - FFMPEG:连接视频的标题卡导致慢动作

java - Android Volley - 在字符串上调用 .length() 时抛出空指针异常,但我没有在任何地方使用 .length()

php - 在 Laravel 中通过 TwigBridge 加载 Twig 扩展

swift - 解析视频上传 - fatal error : unexpectedly found nil while unwrapping an Optional Value

encoding - 使用 ffmpeg 进行多比特率编码

bash - FFmpeg如何连接视频并输出相同的文件前缀