php本身不能直接转视频格式,必须调用系统级工具ffmpeg;需确保ffmpeg已安装并加入$path,php进程有读写权限,且命令参数正确(如-c:v libx264 -crf 20 -c:a aac),批量处理时须注意路径转义、编码器支持及超时控制。

PHP本身不能直接转视频格式
PHP不是多媒体处理工具,ffmpeg才是。PHP脚本只能调用系统命令来驱动ffmpeg完成转换。如果你没装ffmpeg,或者没加到$PATH里,exec()或shell_exec()会静默失败或报错Command not found。
确认方式很简单,在终端运行:ffmpeg -version。返回版本号才算就位。Windows用户注意:别只下载ffmpeg.exe就完事,得把它所在目录加进系统环境变量,否则PHP进程找不到它。
用PHP调用ffmpeg批量转AVI为H.264 MP4
核心是拼对ffmpeg命令参数。AVI只是容器,真正要重编码的是里面的视频流(通常是mpeg4或msmpeg4),MP4推荐用libx264编码器 + aac音频,画质靠-crf控制(值越小越清晰,18–23是常用区间)。
-
-i指定输入文件,路径必须存在且PHP有读权限 -
-c:v libx264强制视频用H.264编码(不加可能继承原码率,体积大、兼容差) -
-crf 20画质基准,比默认23更清晰,但文件略大 -
-c:a aac -b:a 128k音频转AAC,避免MP4不支持的mp3或ac3流 -
-movflags +faststart让MP4能边下边播,网页播放必备 - 输出路径需确保目录可写,扩展名强制用
.mp4(别留.avi后缀)
示例PHP片段:
foreach (glob('*.avi') as $file) {
$out = pathinfo($file, PATHINFO_FILENAME) . '.mp4';
$cmd = "ffmpeg -i " . escapeshellarg($file) .
" -c:v libx264 -crf 20 -c:a aac -b:a 128k -movflags +faststart " .
escapeshellarg($out);
exec($cmd, $output, $return_code);
if ($return_code !== 0) {
error_log("FFmpeg failed on {$file}: " . implode("\n", $output));
}
}
常见失败原因和绕过技巧
批量跑时最常卡在三类问题:权限、路径空格、编码器缺失。
- Linux下PHP运行用户(如
www-data)可能没权限读源文件或写目标目录 —— 检查ls -l和chown/chmod - 文件名含空格或中文?必须用
escapeshellarg()包裹,否则命令被截断 - 报错
Unknown encoder 'libx264'?说明ffmpeg编译时没启用x264支持 —— 重装带--enable-libx264的版本,或改用-c:v mpeg4(但画质和兼容性下降) - 内存爆掉或超时?
set_time_limit(0)和ini_set('memory_limit', '1G')得加,但更稳妥是单次只处理1–2个文件,用队列分批
高清≠无脑调高参数
“高清”不是单纯拉高分辨率或码率。很多AVI源本身只有480p,强行resize到1080p只会模糊拉伸。真正有效的做法是:
- 先用
ffprobe -v quiet -show_entries stream=width,height -of csv=p=0 input.avi查原始分辨率 - 如果源宽≥1280,再用
-vf scale=-2:720等比缩放到720p;否则保持原尺寸,只优化编码 -
-preset slow比fast多花2–3倍时间,但同等CRF下体积小15%–20%,适合后台批量 - 别忽略音频采样率:
-ar 44100比默认48000更通用,尤其老设备
转完记得验证:用ffprobe output.mp4看是否含h264视频流和aac音频流,而不是copy或unknown。否则只是封装转换,根本没重编码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











