php执行ffmpeg前须确认环境:ffmpeg必须已安装且php进程(如www-data)可通过which ffmpeg找到其路径,同时对输入、输出及水印文件具备读写权限;命令需加2>&1捕获stderr错误,用realpath()转绝对路径并加-y参数防卡住。

PHP执行FFmpeg命令前,先确认系统环境是否支持
直接用 exec() 调用 ffmpeg 失败,八成不是PHP代码问题,而是环境没配好。最常踩的坑是:PHP运行用户(比如 www-data 或 nginx)根本找不到 ffmpeg 命令,或者没权限读写视频文件。
实操建议:
- 在终端用
which ffmpeg查真实路径,别依赖PATH—— PHP的PATH和你 Shell 的往往不一样 - 在PHP里先测试命令能否执行:
exec('which ffmpeg 2>&1', $out, $return); var_dump($return, $out);,返回0才说明能找到 - 确保PHP进程对输入MP4、输出目录、临时目录都有读写权限;水印图也要能被PHP进程读取(比如放在
/var/www/html/assets/watermark.png而非用户家目录) - 如果用的是共享主机或Docker,
ffmpeg很可能压根没装——得自己编译或换镜像(如php:8.2-cli-slim不带ffmpeg,得额外apt install ffmpeg)
加水印的核心命令要带 -y 和绝对路径,别信相对路径
PHP里拼接的FFmpeg命令,一旦含空格、中文或特殊字符,不加引号必出错;而相对路径在Web请求下极易指向错目录(比如当前工作目录是 /var/www/html/,但PHP脚本在 /var/www/html/admin/)。
实操建议:
- 所有路径用
realpath()转成绝对路径:$input = realpath('/upload/test.mp4'); - 强制覆盖输出加
-y,否则遇到同名文件会卡住等待输入(PHP就一直挂起) - 水印位置推荐用
overlay=10:10(左上角),比overlay=main_w-overlay_w-10:main_h-overlay_h-10更稳;缩放水印用scale=120:-1避免变形 - 完整命令示例:
ffmpeg -i /var/www/html/upload/in.mp4 -i /var/www/html/assets/wm.png -filter_complex "overlay=10:10" -y /var/www/html/upload/out.mp4 2>&1
exec() 返回空?多半是错误被吞了,必须捕获 stderr
exec() 默认只返回最后一行 stdout,而FFmpeg报错全在 stderr(比如 No such file or directory、Invalid argument),不显式重定向就等于“静默失败”。
实操建议:
- 命令末尾加
2>&1把 stderr 合并到 stdout,再用exec($cmd, $output, $return)拿完整输出 - 检查
$return:0 是成功,非0 就是出错了,$output里才有真实原因 - 别用
shell_exec()——它不返回状态码,出错时很难定位;也别用system(),它直接输出到浏览器,容易崩HTML结构 - 加个超时保护:
exec($cmd . ' & timeout 60', $output, $return)(Linux)或改用proc_open()控制更细
PHP里处理大MP4容易超时或内存溢出,得绕开
FFmpeg本身是流式处理,不占PHP内存,但PHP默认设置会拖后腿:max_execution_time 通常30秒,而转码一个500MB MP4可能要2分钟;memory_limit 设太高也没用,因为瓶颈不在PHP内存,而在进程阻塞和超时。
实操建议:
- 调用前设
set_time_limit(0),关掉PHP超时(注意:Apache的Timeout指令或Nginx的fastcgi_read_timeout仍可能中断) - 用
proc_open()替代exec(),可实时读stderr进度(比如匹配frame=.*fps=),还能主动 kill 进程 - 生产环境别在Web请求里直接跑FFmpeg——应写入任务队列(Redis + Worker),用CLI模式执行,避免用户等或连接断开
- 加水印不重编码的话,用
-c:v copy -c:a copy可提速10倍,但要求水印滤镜兼容(overlay本身不支持纯copy,得至少重编码视频流)
水印位置计算、透明度控制、字体文字水印这些进阶需求,都建立在命令能稳定跑通的基础上;没日志、不看 $return、路径靠猜,后面全白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











