使用ffmpeg命令行工具配合php的exec函数或shell命令类是转换avi到mp4最直接且稳定的做法。通过调用ffmpeg二进制文件并指定输入输出格式及编码参数,可以将视频流重新封装为mp4容器。若遇到权限不足或路径错误,需检查web服务器用户对ffmpeg可执行文件的访问权限以及输入文件的绝对路径。

exec()调用FFmpeg时如何传递参数
在PHP中直接调用exec函数执行系统命令是最基础的实现方式。需要构建包含-i输入文件和escapeshellarg对路径进行转义以防止注入风险。执行后应检查返回值和标准错误输出以确认转换是否成功。

$input = '/path/to/input.avi';
$output = '/path/to/output.mp4';
$cmd = sprintf('ffmpeg -i %s -c:v libx264 -crf 23 -c:a aac %s', escapeshellarg($input), escapeshellarg($output));
exec($cmd, $outputArray, $returnCode);
if ($returnCode !== 0) {
echo 'Conversion failed: ' . implode("\n", $outputArray);
} else {
echo 'Success';
}
使用proc_open处理长耗时任务
对于较大的AVI文件,转换过程可能较长,使用proc_open可以更精细地控制进程状态并实时获取进度信息。该方法允许打开文件句柄读取stderr中的FFmpeg日志,从而解析出当前的处理百分比。相比exec,它更适合需要反馈进度的场景,但代码复杂度稍高。

$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open('ffmpeg -i input.avi -c:v libx264 output.mp4', $descriptorspec, $pipes);
if (is_resource($process)) {
while (!feof($pipes[2])) {
$line = fgets($pipes[2]);
// Parse progress from $line
}
proc_close($process);
}
FFmpeg返回非零退出码时的常见原因
当转换失败时,exec或proc_open返回的非零退出码通常指向具体的错误类型。最常见的原因是输入文件损坏、编解码器不支持或磁盘空间不足。通过捕获标准错误输出(stderr),可以获取FFmpeg打印的具体错误信息,例如“Invalid data found when processing input”,这有助于快速定位问题根源而非盲目重试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











