php通过调用ffmpeg命令实现视频滚动字幕,需先安装ffmpeg,再用ass格式文件或drawtext滤镜添加从下向上的动态字幕,并用exec()执行带错误捕获的命令。

PHP 本身不能直接渲染或处理视频帧,但可以通过执行系统命令的方式调用 ffmpeg 工具,实现给视频添加滚动字幕(如从下往上滚动的歌词、公告等)。关键在于构造正确的 ffmpeg 命令,并确保服务器环境已安装并配置好 ffmpeg。
1. 确保服务器已安装 ffmpeg
在终端中运行以下命令验证:
ffmpeg -version
若提示“command not found”,需先安装 ffmpeg(Ubuntu/Debian:sudo apt install ffmpeg;CentOS/RHEL:sudo yum install epel-release && sudo yum install ffmpeg;macOS:brew install ffmpeg)。
2. 准备滚动字幕文件(SRT 或 ASS 格式)
滚动字幕推荐使用 ASS 格式(Advanced SubStation Alpha),它支持位置、运动、样式控制。例如创建 scroll.ass:
[Script Info]
Title: Scroll Subtitle
ScriptType: v4.00+
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,SimHei,28,&H00FFFFFF,&H0000FFFF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,20,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:10.00,Default,,0,0,0,,{\move(100,720,100,0)}滚动字幕从底部向上移动
说明:{\move(x1,y1,x2,y2)} 表示从 (x1,y1) 移动到 (x2,y2),适合全屏竖向滚动。需根据视频分辨率调整坐标(如 1280×720 视频,y=720 是底部)。
3. PHP 中执行 ffmpeg 命令添加字幕
使用 exec()、shell_exec() 或 proc_open() 调用 ffmpeg。推荐用 exec() 并捕获错误输出:
php
$input = '/path/to/input.mp4';
$output = '/path/to/output_with_scroll.mp4';
$ass = '/path/to/scroll.ass';
$cmd = "ffmpeg -i \"{$input}\" -vf \"ass={$ass}\" -c:a copy \"{$output}\" 2>&1";
exec($cmd, $outputLines, $returnCode);
if ($returnCode !== 0) {
echo "FFmpeg 执行失败:\n" . implode("\n", $outputLines);
} else {
echo "字幕添加成功:{$output}";
}
?>
注意点:
- 路径必须是绝对路径,避免因 PHP 工作目录不确定导致文件找不到
- 使用
-c:a copy直接复制音频流,节省时间 -
-vf "ass=..."是核心滤镜,要求 ffmpeg 编译时启用了 libass 支持(大多数现代安装默认包含) - 生产环境建议加超时限制和输入校验(如
file_exists()、is_readable())
4. 替代方案:纯命令行生成动态滚动(无需 ASS 文件)
如果只是简单单行文字滚动,也可用 ffmpeg 内置的 drawtext 滤镜动态生成:
ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/simhei.ttf:fontsize=28:fontcolor=white:x=100:y=h-t*20:text='这是一行滚动字幕':enable='between(t,0,10)'" -c:a copy output.mp4
其中 y=h-t*20 表示从屏幕底部(h)随时间 t 向上移动,速度由系数 20 控制。PHP 中同样可拼接该命令执行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











