php通过调用ffmpeg实现音视频合并:先检测ffmpeg是否存在,再用shell_exec执行命令;基础场景为视频+背景音乐(丢弃原声),进阶支持混音;需注意路径、权限、安全过滤及异步处理。

PHP 本身不直接处理音视频,但可以通过执行系统命令调用 ffmpeg 来完成视频与背景音乐的合并。关键在于构造正确的 ffmpeg 命令,并用 PHP 的 exec、shell_exec 或 proc_open 安全执行它。
确保 ffmpeg 已安装并可访问
在 PHP 所在服务器(尤其是 CLI 环境或 Web 服务用户如 www-data)中,需能直接运行 ffmpeg -version。常见路径:
-
Linux/macOS:通常为
/usr/bin/ffmpeg或/usr/local/bin/ffmpeg -
Windows(WAMP/XAMPP):需将 ffmpeg 的 bin 目录加入系统 PATH,或使用绝对路径如
C:\ffmpeg\bin\ffmpeg.exe
PHP 中可先检测:
$output = shell_exec('which ffmpeg 2>&1');
if (empty($output)) {
die('ffmpeg 未找到,请检查安装和权限');
}
基础合并命令:视频 + 背景音乐(静音原声)
最常用场景:用一个 MP4 视频 + 一个 MP3 背景音乐,输出新视频,**丢弃视频原有音频**,仅保留背景音乐:
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest -map 0:v:0 -map 1:a:0 output.mp4
-
-c:v copy:视频流不重编码(快且无损) -
-c:a aac:音频转为 AAC 格式(MP4 兼容) -
-shortest:以较短的输入(视频或音频)为准截断输出 -
-map 0:v:0:取第 1 个输入(video.mp4)的视频流 -
-map 1:a:0:取第 2 个输入(audio.mp3)的音频流
PHP 中执行示例:
$video = '/path/to/video.mp4';
$audio = '/path/to/audio.mp3';
$output = '/path/to/output.mp4';
$cmd = sprintf(
'ffmpeg -i %s -i %s -c:v copy -c:a aac -shortest -map 0:v:0 -map 1:a:0 %s 2>&1',
escapeshellarg($video),
escapeshellarg($audio),
escapeshellarg($output)
);
$result = shell_exec($cmd);
if (file_exists($output) && filesize($output) > 0) {
echo "合并成功:$output";
} else {
echo "失败,详情:$result";
}
进阶需求:保留视频原声 + 叠加背景音乐(混音)
若需「原音 + 背景音乐」同时存在(如人声解说+轻音乐),要用 amix 滤镜:
ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[0:a][1:a]amix=inputs=2:duration=shortest" -c:v copy -c:a aac output.mp4
-
[0:a]是视频自带音频,[1:a]是背景音乐 -
amix=inputs=2表示混合两个音频流 - 可加
volume=0.3控制背景音量,例如:[1:a]volume=0.3[a1]; [0:a][a1]amix=...
安全与稳定性提醒
-
永远使用
escapeshellarg()包裹用户传入的文件路径,防止命令注入 - Web 环境下注意 PHP 进程用户(如 www-data)对输入/输出目录是否有读写权限
- 大文件合并耗时长,建议异步处理(如写入队列、用后台进程或 AJAX 轮询)
- 添加超时控制(
proc_open可设 timeout)避免卡死 - 检查输出码率、分辨率是否符合预期,必要时添加
-vf scale=-2:720统一分辨率
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











