php可通过调用ffmpeg实现视频片头片尾拼接:先统一转为mpeg-2 ts中间格式,再用concat协议合并;需校验ffmpeg可用性、文件权限与参数一致性,并用escapeshellarg()确保命令安全。

PHP 本身不直接处理视频,但可以通过执行系统命令调用 FFmpeg 来实现给视频添加片头(intro)和片尾(outro)。核心思路是:用 FFmpeg 将片头、原视频、片尾三个文件按顺序拼接,并统一编码参数保证兼容性。
准备前提:确保 FFmpeg 可用
确认服务器已安装 FFmpeg 并可被 PHP 调用:
- 在终端运行
ffmpeg -version验证安装 - PHP 中用
exec('which ffmpeg', $output)或shell_exec('ffmpeg -version')检查路径与权限 - Web 服务用户(如 www-data、nginx、apache)需有执行 ffmpeg 和读写视频文件的权限
片头+原片+片尾三段拼接(推荐方案)
这是最稳定的方式:把 intro.mp4、main.mp4、outro.mp4 合并为一个新视频。关键在于使用 concat 协议(要求所有片段格式/分辨率/帧率/编码一致)或先转成中间格式再 concat。
✅ 推荐步骤(兼容性强):
- 将三段视频统一转为无损中间格式(如 MPEG-2 transport stream),避免编码不一致导致拼接失败
- 生成列表文件
list.txt,内容为:file 'intro.ts'<br>file 'main.ts'<br>file 'outro.ts'
- 执行拼接命令:
ffmpeg -f concat -safe 0 -i list.txt -c copy -y output.mp4
(-c copy表示不重新编码,速度快;若提示编码不匹配,改用-c:v libx264 -c:a aac重编码)
PHP 中安全执行拼接命令
不要直接拼接用户输入!务必过滤路径、校验文件存在、限制超时和资源占用:
- 用
escapeshellarg()处理所有文件路径 - 检查文件是否真实存在且可读:
is_readable($path) - 设置执行超时(如 300 秒)和内存限制(避免大视频卡死)
- 示例代码片段:
$intro = escapeshellarg('/path/to/intro.mp4');
$main = escapeshellarg('/path/to/main.mp4');
$outro = escapeshellarg('/path/to/outro.mp4');
$output = escapeshellarg('/path/to/output.mp4');
// 转中间格式(ts)
exec("ffmpeg -i $intro -c copy -bsf:v h264_mp4toannexb -f mpegts {$intro}.ts 2>&1", $log1, $ret1);
exec("ffmpeg -i $main -c copy -bsf:v h264_mp4toannexb -f mpegts {$main}.ts 2>&1", $log2, $ret2);
exec("ffmpeg -i $outro -c copy -bsf:v h264_mp4toannexb -f mpegts {$outro}.ts 2>&1", $log3, $ret3);
// 生成 list.txt
file_put_contents('list.txt', "file '{$intro}.ts'\nfile '{$main}.ts'\nfile '{$outro}.ts'");
// 拼接
$list = escapeshellarg('list.txt');
exec("ffmpeg -f concat -safe 0 -i $list -c copy -y $output 2>&1", $log4, $ret4);
if ($ret4 === 0) {
echo "合成成功:$output";
} else {
echo "失败,错误:" . implode("\n", $log4);
}
注意事项与常见问题
- 音频对齐:片头/片尾若无声或时长不匹配,可能导致合成后音画不同步。建议统一采样率(如 48kHz)、声道数(如 stereo)
-
分辨率/帧率必须一致:否则
-c copy会失败,需重编码(速度慢,CPU 高)。可用ffmpeg -i file.mp4 -vframes 1 -f null -查看参数 -
临时文件清理:记得在成功后删除
.ts文件和list.txt - 大文件处理:Web 请求超时?考虑异步队列(如 Redis + Worker)或 CLI 模式运行
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











