不能,PHP本身不具视频编解码能力,必须依赖ffmpeg等外部工具完成MP4转码;PHP仅负责安全调用命令、传递参数(需escapeshellarg过滤)、捕获stderr并校验$return_code与错误关键词,同时确保编码符合Web兼容规范(如libx264+aac+faststart)。

PHP 能直接转 MP4 吗?不能,得靠外部工具
PHP 本身没有视频编解码能力,ffmpeg 才是实际干活的。PHP 只负责调用命令、传参、监控执行结果。别试图用 file_get_contents() + file_put_contents() “复制”视频——那只是改个后缀,根本不是转码。
怎么调用 ffmpeg 提取音频并保存为 MP3 或 WAV
核心是拼对 ffmpeg 命令参数。常见错误是路径含空格没加引号、输入文件不存在、输出目录无写权限、没加 -y 导致交互式阻塞。
-
ffmpeg -i /path/to/input.mp4 -vn -acodec libmp3lame -ab 128k /path/to/output.mp3:提取音频,转 MP3 -
ffmpeg -i /path/to/input.mp4 -vn -acodec pcm_s16le -ar 44100 /path/to/output.wav:提取原始 PCM 音频(WAV) - 务必检查
ffmpeg是否在系统 PATH 中,或用绝对路径如/usr/bin/ffmpeg - PHP 中用
exec()或shell_exec()调用时,记得过滤用户输入,避免命令注入——尤其别直接拼接文件名
PHP 调用时怎么捕获错误和判断是否成功
只看 PHP 返回值不够:exec() 的返回码可能为 0 即使 ffmpeg 实际失败(比如目标目录不可写但 ffmpeg 没报错)。必须同时读 stderr 输出。
- 用
exec($cmd . ' 2>&1', $output, $return_code)把 stderr 合并到 stdout -
$return_code !== 0说明出错,但也要检查$output是否含error、Invalid data、No such file等关键词 - 注意超时:大视频转音频可能耗时几十秒,PHP 默认
max_execution_time=30,需临时调整或异步处理 - 不要忽略权限问题:Web 服务器用户(如 www-data)必须对输入文件有读权限、对输出目录有写权限
为什么转出来的 MP4 播放不了?常见编码兼容性坑
“转成 MP4”不等于“能被浏览器播放”。H.264 + AAC 是 Web 安全组合;用 libx265(HEVC)或 opus 音频,很多浏览器直接拒播。
立即学习“PHP免费学习笔记(深入)”;
- 确保视频编码为
-vcodec libx264,关键帧间隔合理:-g 30(每秒 30 帧设一个 I 帧) - 音频必须是
-acodec aac,采样率推荐-ar 44100,声道数-ac 2 - 加上
-movflags +faststart:把 moov box 移到文件开头,否则网页播放器要等整个文件下载完才能开始播 - 别省略
-preset medium和-crf 23,否则默认参数可能生成体积巨大或画质崩坏的文件
真正麻烦的从来不是写几行 PHP,而是 ffmpeg 参数组合、权限链路、错误分流和浏览器兼容性——每个环节断掉,都会卡在“看似运行了,但没结果”。



















