PHP不能直接合并视频,需调用ffmpeg工具,推荐使用concat协议(-c copy)实现无损快速合并,格式不一致时须先统一转码,同时注意文件过滤、escapeshellarg防护及异步处理。

PHP 本身不能直接合并视频,但可以通过执行系统命令调用 ffmpeg 工具完成多个视频文件的合并。关键在于:确保服务器已安装 ffmpeg、PHP 有执行权限、视频格式兼容,并选择合适合并方式(如 concat 协议或中间转码)。
确认 ffmpeg 已安装并可被 PHP 调用
在终端运行 ffmpeg -version 验证安装;在 PHP 中用 exec('which ffmpeg', $out) 或 shell_exec('ffmpeg -version 2>&1') 检查是否能访问。若返回空或报错,需联系管理员安装或配置 PATH。
使用 concat 协议(推荐:不重编码,速度快)
适用于格式、编码参数(分辨率、帧率、码率、音频采样率等)完全一致的视频。步骤如下:
- 将待合并的视频(如
1.mp4、2.mp4、3.mp4)放在同一目录下 - 生成临时文本文件
filelist.txt,内容为:file '1.mp4'<br>file '2.mp4'<br>file '3.mp4'
- PHP 中执行命令:
$cmd = 'ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4 2>&1';<br>exec($cmd, $output, $returnCode);
注意:-safe 0允许使用相对路径;-c copy表示流直接复制,不重新编码
统一格式后合并(兼容性更强)
当视频参数不一致时,concat 会失败。此时需先转成统一格式再合并:
立即学习“PHP免费学习笔记(深入)”;
- 逐个转码为相同参数(如 H.264 + AAC,1280x720,30fps):
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -vf "scale=1280:720" -r 30 -y temp_01.mp4 - 生成新 filelist.txt 指向所有
temp_*.mp4 - 再用 concat + copy 合并,或直接用
-c:v libx264 -c:a aac编码输出
PHP 调用注意事项
避免安全与执行问题:
- 对输入文件名做严格过滤(如只允许字母、数字、下划线、点号),禁用路径遍历(如
../) - 使用
escapeshellarg()包裹每个文件路径:$files = ['1.mp4', '2.mp4'];<br>$quoted = array_map('escapeshellarg', $files); - 设置超时(如
set_time_limit(300))并捕获错误输出:$cmd .= ' 2>&1';<br>$result = shell_exec($cmd);<br>if (strpos($result, 'error') !== false || $returnCode !== 0) { /* 处理失败 */ } - 生产环境建议异步处理(如写入队列、用守护进程执行),避免 Web 请求阻塞
不复杂但容易忽略:合并前务必检查音视频同步、关键帧对齐和编码兼容性。小批量测试成功后再投入正式流程。



















