PHP需调用ffmpeg实现字幕烧录,须确保安装ffmpeg、启用exec函数、srt为UTF-8编码;命令为ffmpeg -i 视频 -vf "subtitles=字幕" -c:a copy 输出 -y,注意字体、权限与超时设置。

PHP 本身不能直接处理视频或字幕合成,但可以通过 执行系统命令调用 ffmpeg 来完成合并(硬嵌字幕)或烧录(burn-in)操作。关键在于确保服务器已安装 ffmpeg,并且 PHP 有权限执行外部命令。
确认环境支持
先检查服务器是否装有 ffmpeg 并支持字幕渲染:
- 终端运行
ffmpeg -version确认已安装 - 运行
ffmpeg -h full | grep -i subtitle查看是否包含 libass 支持(硬嵌 srt 必需) - PHP 需开启
exec、shell_exec或proc_open(部分主机禁用,需确认)
PHP 调用 ffmpeg 烧录 srt 字幕到视频
使用 subtitles 滤镜将 srt 文件内容“画”进视频画面(硬字幕),生成新视频文件:
$videoPath = '/path/to/input.mp4';
$srtPath = '/path/to/subtitle.srt';
$outputPath = '/path/to/output_with_sub.mp4';
// 构建 ffmpeg 命令(注意路径需转义空格,推荐用 escapeshellarg)
$cmd = sprintf(
'ffmpeg -i %s -vf "subtitles=%s" -c:a copy %s -y',
escapeshellarg($videoPath),
escapeshellarg($srtPath),
escapeshellarg($outputPath)
);
// 执行并捕获输出(便于调试)
$output = [];
$returnCode = 0;
exec($cmd . ' 2>&1', $output, $returnCode);
if ($returnCode === 0) {
echo "字幕烧录成功:{$outputPath}";
} else {
echo "失败,错误信息:" . implode("\n", $output);
}
⚠ 注意:srt 文件编码必须为 UTF-8(无 BOM),否则可能乱码或报错;若含中文路径或特殊字符,务必用 escapeshellarg() 包裹。
立即学习“PHP免费学习笔记(深入)”;
常见问题与处理
-
字体缺失导致中文乱码:添加 fontfile 参数指定中文字体,例如:
subtitles=subtitle.srt:fontsdir=/usr/share/fonts/truetype/wqy/ -
srt 时间轴偏移:可在滤镜中加
subtitles=xxx.srt:original_script=1或用setpts调整,但更推荐提前用工具校准 srt - 权限被拒:检查 PHP 运行用户(如 www-data)对输入/输出目录是否有读写权限
-
超时中断:大视频处理时间长,需设置:
set_time_limit(0)并确认 web 服务器(如 Nginx)的 proxy_read_timeout 也足够长
替代方案:软字幕(不推荐用于最终分发)
若只需封装字幕流(不烧录),可用:
ffmpeg -i input.mp4 -i subtitle.srt -c copy -c:s mov_text output.mp4
但该方式依赖播放器支持,多数手机/网页播放器默认不显示外挂字幕,实际兼容性差,仅适合内部流转。



















