视频转码同步执行PHP代码有五种方法:一、FFmpeg命令后用&&调用PHP脚本;二、通过-progress HTTP接口轮询触发回调;三、监听输出文件写入完成事件;四、借助消息队列解耦执行;五、利用-vstats_file生成日志触发钩子。

如果在视频转码过程中需要同步执行 PHP 代码,通常是因为需在转码完成、失败或特定阶段触发业务逻辑,例如更新数据库状态、发送通知、生成缩略图或写入日志。以下是实现该目标的多种方法:
一、通过 FFmpeg 的 -exec 或 -report 机制配合 shell 脚本调用 PHP
FFmpeg 本身不直接支持 PHP 执行,但可通过其 -exec 参数(需编译时启用)或结合 shell 脚本,在转码结束时调用 PHP 解释器运行指定脚本。
1、编写 PHP 脚本 /var/www/trigger/transcode_done.php,确保具有可执行权限且 Web 服务器用户可读。
2、构造 FFmpeg 命令,在转码完成后执行 shell 命令:ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4 -y && php /var/www/trigger/transcode_done.php。
立即学习“PHP免费学习笔记(深入)”;
3、若需传递参数(如输入文件名、输出路径),可在命令中追加:&& php /var/www/trigger/transcode_done.php "input.mp4" "output.mp4"。
二、使用 FFmpeg 的 -progress HTTP 接口轮询并触发回调
FFmpeg 支持通过 -progress 参数向 HTTP 端点持续上报进度,PHP 后端可监听该端点,在收到 finish 事件时执行对应逻辑。
1、启动一个轻量 PHP HTTP 服务(如使用 PHP 内置服务器)监听 /transcode-progress。
2、运行 FFmpeg 命令:ffmpeg -i input.mp4 -c:v libx264 output.mp4 -y -progress http://127.0.0.1:8000/transcode-progress。
3、PHP 服务接收到包含 quit=1 或 progress=finished 的 POST 请求后,解析 query 参数并调用业务函数。
三、基于文件系统事件监听转码输出文件生成
当转码输出文件被完整写入磁盘时,可借助 inotifywait(Linux)或 fswatch(macOS)监控目标目录,检测文件创建或关闭写入事件,进而调用 PHP 脚本。
1、安装 inotify-tools:apt-get install inotify-tools(Debian/Ubuntu)。
2、运行监听命令:inotifywait -m -e close_write /var/www/output/ | while read path action file; do [ \"\$file\" = \"output.mp4\" ] && php /var/www/trigger/on_file_complete.php \"\$file\"; done。
3、确保 PHP 脚本中校验文件大小是否稳定(避免监听到未写完的临时文件),可添加 sleep 1 后二次 stat 比对。
四、通过消息队列解耦转码与 PHP 执行
将转码任务提交至队列系统(如 Redis List、RabbitMQ),由独立的 PHP Worker 进程消费任务并在转码结束后执行回调逻辑,提升可靠性与扩展性。
1、FFmpeg 转码完成后,使用 redis-cli 向队列推送完成消息:echo \"{'job_id':'abc123','status':'done','output':'/out/video.mp4'}\" | redis-cli -n 2 RPUSH transcode_queue。
2、PHP Worker 使用 while 循环阻塞式读取:$msg = $redis->blPop('transcode_queue', 0)。
3、Worker 解析 JSON 消息,调用业务类处理完成事件,如更新 MySQL 中 job_status 字段为 completed。
五、利用 FFmpeg 的 -f null 输出配合 -vstats_file 触发钩子
通过伪造一个无实际输出的转码流程(-f null),同时启用 -vstats_file 记录统计信息,当该文件被成功创建并写入最终帧数据时,视为转码逻辑完成,可触发 PHP 调用。
1、执行命令:ffmpeg -i input.mp4 -f null -vstats_file /tmp/vstats_abc.log -v quiet -stats。
2、编写检测脚本定期检查 /tmp/vstats_abc.log 是否存在且末尾含 frame=xxxx,表示已到达终帧。
3、一旦确认完成,执行:php /var/www/trigger/post_vstats.php /tmp/vstats_abc.log,由 PHP 解析日志提取耗时、帧数等信息。











