ffmpeg必须先安装并验证可用性,web进程需有执行权限且路径正确;php调用推荐proc_open()以捕获实时流和错误;转码须指定h.264+aac编码、缩放滤镜、faststart标志及-y参数;php-ffmpeg库仅封装命令,不解决权限、并发等问题。

FFmpeg装没装?先确认再动手
别急着写PHP代码,ffmpeg 命令在服务器上根本跑不起来,后面全白搭。Web进程(比如 www-data 或 nginx 用户)必须能调用它,且路径得对。
- Linux下用
sudo apt install ffmpeg(Ubuntu/Debian)或yum install ffmpeg(CentOS 7+),装完执行ffmpeg -version看输出是否正常 - Windows用户下载官方预编译包,把
bin/目录加进系统PATH,然后 cmd 里敲ffmpeg -version验证 - PHP里别硬写
/usr/bin/ffmpeg,用exec('which ffmpeg', $out)动态获取路径更稳;如果返回空,说明环境变量没生效或权限被限制 - 某些云主机或容器环境默认禁用
exec类函数,检查php.ini中的disable_functions是否包含exec,shell_exec,proc_open
PHP调用FFmpeg:用 exec() 还是 proc_open()?
exec() 最简单,但拿不到实时进度、错误也容易吞掉;proc_open() 能控制 stdin/stdout/stderr,适合需要监控或中断的场景——多数上传转码需求选后者更靠谱。
- 用
exec()快速验证:exec('ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4 2>&1', $output, $return_code);$return_code !== 0就代表失败,$output里有具体报错 - 用
proc_open()捕获流:$process = proc_open($cmd, [0=>['pipe','r'], 1=>['pipe','w'], 2=>['pipe','w']], $pipes);记得fclose($pipes[0])后再proc_close($process),否则可能卡住 - 别忽略
2>&1—— FFmpeg 把错误日志写到 stderr,不重定向就看不见关键信息,比如Invalid data found when processing input或Permission denied - Web请求超时常见,PHP默认
max_execution_time=30,转一个大视频肯定不够,要么改配置,要么扔进队列异步跑
基础转码命令里这几个参数不能乱设
直接跑 ffmpeg -i in.avi out.mp4 是能转,但大概率播不了——浏览器只认 H.264 + AAC 封装在 MP4 容器里,缺一不可。
-
-c:v libx264:强制视频编码为 H.264,别依赖自动选择,有些老版本 FFmpeg 对 HEVC 支持不全 -
-c:a aac:音频必须用 AAC,MP3 在 HTML5<video></video>标签里不保证兼容 -
-vf "scale=1280:-2":加个缩放滤镜,-2表示保持宽高比自动算高度,避免黑边或拉伸 -
-movflags +faststart:关键!让 MP4 元数据写在文件开头,网页播放器不用等整个文件下载完就能起播 - 别省
-y参数——覆盖输出文件前不提示,否则命令卡住,PHP进程就挂那儿不动了
PHP-FFMpeg 库真香?先看清它背后还是调命令
php-ffmpeg/php-ffmpeg 封装得漂亮,但底层仍是拼 ffmpeg 命令行,不是魔法。它帮你省了字符串拼接,但权限、路径、错误捕获这些还得你兜底。
- 安装用
composer require php-ffmpeg/php-ffmpeg,注意 PHP 版本要求(v4.x 要 PHP 8.0+) - 初始化时传路径别用相对路径:
$ffmpeg->open('/var/www/uploads/video.webm'),Web进程很可能没权限读这个位置 -
$video->export()->to('mp4')->save('out.mp4')看似一行,实际会生成完整命令并调用proc_open();失败时抛异常,但异常信息里未必含 FFmpeg 原始 stderr,得开 debug 模式或自己抓日志 - 它不解决并发问题——多个请求同时调
transcode(),CPU 和磁盘 I/O 照样打满,该加队列还得加 - 真正省事的是水印、截图、提取音频这些功能,基础转码和手写命令没本质区别
ffmpeg 命令复制出来,切到服务器命令行手动执行一遍,错误信息立马清晰。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











