字幕到底是"贴"上去的还是"装"进去的?聊聊 SRT、VTT、ASS 与内嵌外挂
你看视频时底部那一行行字幕,有的能开关、有的去不掉、有的自带特效和颜色。同样是"字幕",它们背后的格式和渲染方式完全不同。本文拆开字幕技术的黑箱:SRT、WebVTT、ASS 三种主流字幕格式各有什么本事,以及"内嵌字幕"和"外挂字幕"到底是怎么回事。
TL;DR:SRT 最简单(纯文本 + 时间戳),WebVTT 是 HTML5 标准(支持样式),ASS 最强大(动画/特效/字体)。内嵌字幕 = 烧进画面里改不了,外挂字幕 = 独立文件可开关。下载视频时,字幕可能单独存放(.srt/.vtt/.ass),需要一并获取。
目录
一、字幕的本质:时间 + 文本
所有字幕格式的核心数据结构都一样:什么时间显示什么文字。
00:00:01,000 --> 00:00:04,000
大家好,今天我们来聊聊视频编码
00:00:04,500 --> 00:00:08,000
你有没有想过,为什么同一个视频...
就这么简单。格式间的区别只在于"能加多少额外信息"——样式、位置、动画、多语言。
二、三大主流字幕格式对比
| 特性 | SRT | WebVTT | ASS/SSA |
|---|---|---|---|
| 结构 | 序号 + 时间 + 文本 | 时间 + 文本 + 可选样式 | 样式块 + 事件行 |
| 样式支持 | 无 | 颜色/粗体/位置 | 字体/颜色/阴影/动画/旋转 |
| 定位 | 仅底部 | 任意位置 | 像素级精确定位 |
| HTML5 兼容 | 需转码 | 原生支持 <track> |
不原生支持 |
| 典型用途 | 电影字幕、简单外挂 | Web 播放器、在线课程 | 动漫字幕组、弹幕效果 |
| 编码 | UTF-8(推荐) | 必须 UTF-8 | 可指定编码 |
SRT 示例:
1
00:00:01,000 --> 00:00:04,000
这是第一行字幕
2
00:00:05,000 --> 00:00:08,500
这是第二行<b>带粗体</b>的字幕
WebVTT 示例:
WEBVTT
00:00:01.000 --> 00:00:04.000
这是第一行字幕
00:00:05.000 --> 00:00:08.500
<c.red>这是红色的字幕</c>
ASS 示例(带样式定义):
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour
Style: Default,Arial,20,&H00FFFFFF
[Events]
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,带样式的字幕
ASS 的能力远超 SRT/VTT——它可以做滚动字幕、卡拉 OK 效果、逐字动画。这就是为什么动漫字幕组的特效字幕几乎都用 ASS 格式。
三、内嵌 vs 外挂:谁说了算
内嵌字幕(硬字幕 / Burn-in):
字幕 → 烧录进画面像素 → 成为视频流的一部分
特点:去不掉、任何播放器都能看到、格式转换后还在
外挂字幕(软字幕 / Softsub):
字幕 → 独立文件(.srt/.ass) 或 封装在容器内(mkv)
特点:可开关、可换语言、可提取编辑
内嵌字幕用 ffmpeg 的 subtitles 滤镜实现:
# 把字幕烧进画面
ffmpeg -i video.mp4 -vf "subtitles=subtitle.srt" -c:a copy output.mp4
外挂字幕用 -c copy 封装进容器:
# 把字幕作为独立轨道装进 MKV
ffmpeg -i video.mp4 -i subtitle.ass -c copy -map 0 -map 1 output.mkv
四、如何从视频中提取/添加字幕
提取字幕:
# 从 MKV 中提取字幕轨道
ffmpeg -i video.mkv -map 0:s:0 subtitle.ass
# 查看有哪些字幕轨道
ffprobe -v error -show_entries stream=index,codec_type:stream_tags=language video.mkv
添加字幕:
# 外挂 SRT 字幕到 MP4(MP4 对字幕支持有限,推荐 MKV)
ffmpeg -i video.mp4 -i subtitle.srt -c copy -c:s mov_text output.mp4
# 装进 MKV(字幕支持更好)
ffmpeg -i video.mp4 -i subtitle.ass -c copy output.mkv
格式互转:
# SRT → ASS(保留样式信息有限)
ffmpeg -i subtitle.srt subtitle.ass
# ASS → SRT(丢失所有样式)
ffmpeg -i subtitle.ass subtitle.srt
五、下载视频时字幕怎么处理
从各平台下载视频时,字幕有几种情况:
- B 站:字幕通常以 JSON 格式通过独立接口返回,需要额外请求获取后转换成 SRT/ASS;
- YouTube:字幕通过
timedtextAPI 获取,可指定语言,支持 SRT/VTT 格式; - 海外流媒体:字幕常封装在 m3u8 的
#EXT-X-MEDIA:TYPE=SUBTITLES里,也是独立的 m3u8 清单。
# yt-dlp 下载视频 + 字幕一步到位
yt-dlp --write-subs --sub-langs "zh-Hans,en" --embed-subs "https://youtube.com/..."
下载时注意:字幕文件是独立资源,不包含在视频文件内。如果你只下了视频文件、没下字幕文件,就看不到字幕。
六、合规与温馨提示
技术是中性的,用法见人心。我们强烈建议:
- 仅下载你自己拥有版权或平台明确允许保存的内容;
- 字幕属于创作者的智力成果,下载后仅用于个人学习、辅助理解;
- 不将字幕用于商业用途或未经授权的再分发。
字幕格式的世界不大,但坑不少。SRT 够用、VTT 适合 Web、ASS 玩出花。下次你下载视频发现"没字幕"时,大概率不是没有——是你忘了把那个单独的 .srt 或 .ass 文件一起带回来。
本文由 VidDown 技术博客原创发布。VidDown 是一个免费、本地优先的在线视频解析与开发者工具站,支持多平台视频下载、格式转换、m3u8 合并等实用功能,所有数据处理均在本地完成,保护你的隐私。欢迎访问 www.viddown.cn 体验。