如何借助protonemedia/laravel-ffmpeg添加可切换的多轨字幕?
实现可切换的双字幕嵌入方案
要让用户能按需切换翻译和转录字幕,你不能用之前的subtitles滤镜(那会把字幕直接烧进画面,或者只生成单轨道字幕),得把两个字幕作为独立的字幕流嵌入视频文件里,这样播放器就能识别并提供切换选项。
直接用laravel-ffmpeg的多输入和流映射功能就能实现,代码示例如下:
use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg; use ProtoneMedia\LaravelFFMpeg\Filters\Video\X264; $format = new X264(); // 给两个字幕轨道设置元数据,方便播放器识别 $format->setAdditionalParameters([ '-metadata:s:s:0 language=chi', '-metadata:s:s:0 title=翻译字幕', '-metadata:s:s:1 language=eng', '-metadata:s:s:1 title=转录字幕', ]); FFMpeg::openUrl($videoUrl) // 引入翻译字幕文件 ->addInput($translationSubtitlePath) // 引入转录字幕文件 ->addInput($transcriptionSubtitlePath) ->export() ->inFormat($format) // 映射视频、音频和两个字幕流到输出文件 ->addOption('-map', '0:v') ->addOption('-map', '0:a') ->addOption('-map', '1:s') ->addOption('-map', '2:s') // 指定字幕编码格式,兼容主流播放器 ->addOption('-c:s', 'subrip') ->save($tmpVideoPath);
关键说明:
addInput():每个字幕文件单独作为一个输入源引入-map参数:明确指定输出要包含的流:0:v= 原视频的视频流0:a= 原视频的音频流1:s= 第一个输入(翻译字幕)的字幕流2:s= 第二个输入(转录字幕)的字幕流
- 元数据设置:
-metadata:s:s:[索引]用来给对应轨道加语言和标题,播放器会显示这些信息,用户能清楚切换哪个字幕 -c:s subrip:指定字幕编码为SubRip格式,几乎所有主流播放器都支持
注意事项:
- 字幕文件建议用SRT或ASS格式,FFmpeg对这两种格式支持最完善
- 如果字幕文件路径包含空格或特殊字符,确保路径被正确转义(laravel-ffmpeg通常会自动处理,但手动指定路径时要留意)
- 确认服务器上的FFmpeg版本支持字幕流嵌入,较新版本的FFmpeg都没问题
内容的提问来源于stack exchange,提问作者rook
相关产品推荐
相关产品推荐

