You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:45:35