字幕格式详解:SRT、ASS、VTT、SUB/IDX 对比与适用场景

做字幕处理这些年,我见过不少人在格式选择上栽跟头。有人拿着 ASS 特效字幕硬往 SRT 里塞,结果特效全丢;也有人把 VTT 当 SRT 用,发现时间轴对不上。说白了,每种格式都有自己的脾气。今天咱们就把四种主流字幕格式掰开揉碎,看看它们到底有什么区别,什么时候该用哪个。

一句话总结:SRT 是通用格式,ASS 是特效格式,VTT 是 Web 格式,SUB/IDX 是 DVD 时代的遗留格式。选对格式,能省掉你 80% 的转码麻烦。

SRT:最通用的字幕格式

SRT 全称 SubRip Text,是字幕界的「普通话」。几乎所有的播放器、剪辑软件、转码工具都支持它。我最早接触字幕就是从 SRT 开始的,那时候还在用暴风影音看美剧。

它的结构极其简单:

1
00:00:01,000 --> 00:00:04,500
你好,世界!

2
00:00:05,000 --> 00:00:08,200
这是第二句字幕。

每个字幕块由三部分组成:序号、时间轴、文本。时间轴格式是 时:分:秒,毫秒,箭头 --> 是固定分隔符。文本支持简单的 HTML 标签,比如 <b>、<i>、<u>,但仅此而已。

我的习惯:如果项目需要跨平台播放,或者不确定对方用什么工具,我首选 SRT。它兼容性最好,几乎不会出问题。我曾经在某个项目里用 ASS 做了精美的特效字幕,结果客户用的老款播放器根本不支持,最后全部转成 SRT 才解决。

ASS:特效字幕的王者

ASS 全称 Advanced SubStation Alpha,是 SRT 的进阶版。它支持丰富的样式控制:字体、字号、颜色、阴影、边框、位置、旋转、动画……你能想到的视觉效果,它基本都能做。

看一个简单的 ASS 示例:

[Script Info]
ScriptType: v4.00+
PlayResX: 1920
PlayResY: 1080

[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,微软雅黑,48,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:04.50,Default,,0,0,0,,{\pos(400,600)}你好,世界!

看到没?ASS 的头部有 [Script Info] 定义分辨率,[V4+ Styles] 定义样式模板,[Events] 才是实际字幕内容。每个字幕行可以单独指定样式、位置、特效。

注意:ASS 的样式定义非常严格。如果你把 PlayResX 设成 1920,但实际视频是 1280 宽,字幕位置就会偏移。我曾经踩过这个坑,做好的字幕在预览时完美,换台电脑就全跑偏了。后来我养成了习惯:ASS 的分辨率必须和视频一致。

ASS 最强大的地方在于它的特效代码。比如:

  • \pos(x,y):固定位置
  • \move(x1,y1,x2,y2,t1,t2):移动动画
  • \fad(t1,t2):淡入淡出
  • \clip(x1,y1,x2,y2):裁剪区域
  • \t(style):过渡动画

这些特效在卡拉 OK 字幕、片头片尾、弹幕效果中特别常用。但要注意,不是所有播放器都支持完整的 ASS 特效。FFmpeg 的 ASS 渲染器(libass)支持度还不错,但某些高级特效(比如 \blur 的某些参数)可能会有兼容问题。

VTT:Web 时代的字幕格式

VTT 全称 WebVTT,是 W3C 标准定义的 Web 字幕格式。它和 SRT 很像,但有一些关键区别。

先看一个 VTT 示例:

WEBVTT

00:00:01.000 --> 00:00:04.500
你好,世界!

00:00:05.000 --> 00:00:08.200
这是第二句字幕。

眼尖的你可能发现了:VTT 的时间轴用 . 而不是 , 来分隔毫秒。另外,VTT 支持一些额外的功能:

  • 样式控制:通过 ::cue CSS 伪元素设置样式
  • 定位:使用 align 属性控制字幕位置
  • 注释:用 NOTE 添加注释行
  • 章节标记:可以用字幕做视频章节导航

VTT 最大的优势是原生支持 HTML5 <video> 标签。你不需要任何插件,浏览器就能直接渲染。我在做 Web 视频播放器项目时,几乎都用 VTT。

避坑指南:我曾经把 SRT 直接改后缀名成 VTT 就丢给前端,结果时间轴全乱。因为 SRT 的毫秒分隔符是 ,,VTT 要求 .。FFmpeg 转换时记得用 -c:s webvtt,别偷懒。

SUB/IDX:DVD 时代的遗留物

SUB/IDX 是 DVD 字幕的格式。它和前面三种完全不同——它不是文本字幕,而是图片字幕。

简单来说:

  • IDX 文件:索引文件,记录字幕的时间轴、位置、颜色等信息
  • SUB 文件:字幕数据文件,包含实际的图片数据(通常是 BMP 或 RLE 压缩格式)

这种格式的优点是:字幕效果完全由制作者控制,不会因为播放器不同而变形。缺点是:文件体积大,不能搜索,不能修改文字(除非重新 OCR)。

我记得有一次接手一个老项目,客户给的 DVD 原盘字幕就是 SUB/IDX 格式。我想提取里面的文字,结果发现必须先用 OCR 工具识别。折腾了半天,最后直接用 FFmpeg 把图片字幕嵌入视频了事。

注意:SUB/IDX 字幕在 FFmpeg 中处理时,需要同时指定 IDX 和 SUB 文件。如果只给一个,FFmpeg 会报错。命令格式通常是:ffmpeg -i video.mp4 -i subtitles.idx -c:s dvd_subtitle output.mkv

四种格式对比一览

特性 SRT ASS VTT SUB/IDX
类型 文本 文本+样式 文本 图片
样式支持 极简(HTML标签) 丰富(字体、动画、特效) 中等(CSS控制) 固定(不可修改)
文件大小 极小 小 极小 大
兼容性 极高 中等 高(Web环境) 低
可编辑性 容易 中等 容易 困难(需OCR)
适用场景 通用、跨平台 特效字幕、卡拉OK Web视频、HTML5播放器 DVD原盘、老旧项目

如何选择?我的经验法则

你可能会问:那我到底该用哪个?嗯,这里有几个判断标准:

  1. 看播放平台:如果是 Web 播放,用 VTT;如果是本地播放器,用 SRT 或 ASS;如果是 DVD 或蓝光,用 SUB/IDX。
  2. 看字幕复杂度:纯文字字幕用 SRT;需要特效、动画、多行样式用 ASS;图片字幕用 SUB/IDX。
  3. 看后期需求:如果后续需要修改文字,别用 SUB/IDX;如果后续需要加特效,别用 SRT。
  4. 看文件大小:如果对文件体积敏感,优先 SRT 或 VTT;ASS 虽然不大,但特效多了也会膨胀。

我个人习惯是:做项目时先用 SRT 把文字内容定下来,等所有文字确认无误后,再根据需求转成 ASS 或 VTT。这样既保证了效率,又不会因为格式问题返工。

知识体系总览

下面这张图帮你理清四种格式的核心差异和选择路径:

字幕格式知识体系 SRT 通用文本字幕 ASS 特效文本字幕 VTT Web 字幕 SUB/IDX 图片字幕 特性 特性 特性 特性 • 纯文本 • 极简样式 • 兼容性最高 • 文件极小 • 易编辑 • 丰富样式 • 动画特效 • 卡拉OK支持 • 兼容性中等 • 可编辑 • 纯文本 • CSS 样式 • HTML5 原生 • 章节标记 • 易编辑 • 图片格式 • 固定效果 • 文件较大 • 兼容性低 • 难编辑 选择路径 Web 播放? 需要特效? 图片字幕? → 选 VTT → 选 ASS → 选 SUB/IDX 都不符合?默认选 SRT,兼容性最好

这张图从左到右展示了四种格式的核心特性,以及根据需求选择格式的决策路径。你想想看,是不是比死记硬背参数要直观得多?

FFmpeg 中的格式转换

最后,咱们看看怎么用 FFmpeg 在这四种格式之间转换。这是实际工作中最常用的操作。

SRT 转 ASS:

ffmpeg -i input.srt output.ass

ASS 转 SRT(会丢失样式):

ffmpeg -i input.ass output.srt

SRT 转 VTT:

ffmpeg -i input.srt -c:s webvtt output.vtt

VTT 转 SRT:

ffmpeg -i input.vtt output.srt

SUB/IDX 转 SRT(需要 OCR,不推荐):

# 先提取为图片序列
ffmpeg -i input.idx -c:s dvd_subtitle -f image2 %d.bmp
# 再用 OCR 工具识别

我的建议:SUB/IDX 转文本字幕非常麻烦,而且 OCR 准确率很难保证。如果可能,尽量找原始文本字幕。实在没办法,可以考虑直接用 FFmpeg 把 SUB/IDX 嵌入视频,保留图片效果。