一部片子带中英双语字幕轨,播放器里随便切——封装多字幕的坑
外剧、公开课、演唱会——经常需要中英双语字幕,而且观众想随时切。很多人做法是"烧进画面",结果想关都关不掉,还糊。正确做法是封装成字幕轨,让播放器负责显示。这篇讲怎么往一个 mp4/mkv 里塞多根字幕、以及为什么 mkv 比 mp4 更适合干这事。
MP4 vs MKV:字幕轨支持的天壤之别
先说结论:要稳定带多字幕轨,优先 MKV。MP4 理论上能用 mov_text 封装,但支持的语言/编码有限,不少播放器只读第一条。MKV 对 SRT/ASS/UTF-8 基本来者不拒。
ffmpeg -i movie.mp4 -i zh.srt -i en.srt -map 0:v -map 0:a -map 1 -map 2 -c copy -c:s srt out.mkv
-map 1 -map 2 把两个字幕文件分别加进去,-c:s srt 指定字幕编码。
坑一:语言标记没写,播放器显示"未知字幕"
观众在 VLC 里看到两条都叫"轨道 1/轨道 2",体验很差。加上 metadata:s:
ffmpeg -i movie.mp4 -i zh.srt -i en.srt -map 0:v -map 0:a -map 1 -map 2 -c copy -c:s srt -metadata:s:s:0 language=chi -metadata:s:s:0 title=中文 -metadata:s:s:1 language=eng -metadata:s:s:1 title=English out.mkv
metadata:s:s:0 是第一条字幕轨,依次类推。不写这个,后面全是白忙。
坑二:ASS 字幕的字体在别人电脑上崩了
SRT 是纯文本,ASS 带样式(字体/位置/特效)。ASS 好看,但换台没装对应字幕字体的机器,样式就乱套。所以要么用通用字体(思源/Noto),要么把字体也嵌进 mkv:
ffmpeg -i movie.mkv -attach NotoSansCJK.ttc -metadata:s:t:0 mimetype=application/x-truetype-font out.mkv
坑三:想"双语同屏"而不是切换
封装轨道是"切换",不是"同屏"。要双语同时显示,只能硬压(把两条字幕都 burn 进去)或者播放器叠加。硬压用 subtitles 滤镜叠两次:
ffmpeg -i movie.mp4 -vf "subtitles=zh.srt:si=0,subtitles=en.srt:si=0" out.mp4
代价:重编码、字幕永久烙在画面上、且中文英文位置会重叠要自己调 force_style。
怎么确认塞进去了
ffprobe -v error -show_entries stream=index,codec_type,codec_name:stream_tags=language,title -of json out.mkv
看到 codec_type=subtitle 出现两条,语言标记对得上,就成了。
一点经验:给观众发,尽量发 MKV + 带语言标记;自己存档,SRT 单独丢一边更灵活。