核心结论
如果视频是在浏览器里播放的,你需要WebVTT。除此之外几乎所有场合,SubRip(.srt)都是最安全的选择,因为它是最简单、接受度最高的格式。SubViewer(.sbv)是YouTube Studio直接给你的格式,通常只是个中转站,而不是终点。ASS和SSA是为带样式、带位置信息的字幕设计的。把功能更丰富的格式转换成SRT,会保留时间轴和文字内容,但会永久丢掉其他一切。而SRT转WebVTT则完全不会有任何损失。
大多数人遇到这个问题,都是因为遇到了麻烦。你手里有一个字幕文件,想拿去用,结果对方不认。现在你需要弄清楚对方到底要什么格式,而你并不想为了这件小事去专门学一套文件格式知识。
所以下面这篇文章是按“用途”来组织的,而不是按“格式”。找到你要把文件用在哪里,直接看对应的格式就行;如果你还想知道转换格式会失去什么,再往下读。这一点其实很重要,因为格式转换并不是双向对等的:有些方向转换完全没有损失,有些方向则会悄悄删掉一些你再也拿不回来的东西。
先看文件要用在哪里
格式不是你想用哪个就用哪个,而是由读取这个文件的那一方决定的,而对方通常只认一种格式。所以要反过来想:先看目的地,再定格式。
- 网页上播放的视频。用WebVTT。这是网页原生支持的格式,浏览器播放器一般不认别的格式。
- 电脑或电视上的播放器,或是和视频文件放在一起的字幕文件。用SubRip。它是最简单的格式,也是最不容易被挑刺的格式。
- 某个平台的上传表单。没有特别说明的话就用SubRip。不同平台的要求不一样,只有上传页面或它的帮助文档才能告诉你这个平台到底认哪种格式。
- 想保留带样式、带位置的效果。用ASS或SSA。再简单的格式都装不下这些信息。
- 手里的文件是YouTube Studio导出的。那这个文件本身就是SubViewer格式,先转成SubRip,通常是让它被其他地方接受的最快办法。
如果你要用的地方不在上面这个列表里,而对方也没给出说明,默认用SubRip就好。这样做确实有代价,但代价不大:SRT没办法表达样式或位置信息,所以字幕会显示在播放器默认的位置,用播放器自带的字体。对于普通的对话字幕来说,这本来就是你想要的效果。
SubRip和WebVTT,真正会用到的两种格式
SubRip已经是文本文件能做到的最简单的程度了。每一条字幕先是单独一行的编号,然后是一行时间信息(开始时间和结束时间),接着是一到两行文字,最后是一个空行,再开始下一条。毫秒和秒之间用逗号隔开。字幕条目之间的那个空行是有实际作用的,这也是为什么手动编辑SRT文件时,有时候明明看不出哪里错了,却还是播不出来。
它的好处就是对读取它的软件几乎没有要求:不用解析样式,不用处理位置信息,也没有文件头需要读。如果你想逐条了解SRT的结构,可以看看这篇关于SRT格式的详细说明。
WebVTT是网页专用的格式,看起来很像SubRip的近亲。文件的第一行必须单独写着WEBVTT,这一行不是摆设,播放器就是靠这一行来识别文件类型的。毫秒和秒之间用的是句点而不是逗号。字幕编号是可选的,所以一个合法的VTT文件可以有编号,也可以没有,两种写法都对。除此之外,WebVTT还能承载位置信息和样式,这也是为什么网页上的字幕有时候不是出现在屏幕正下方。
这两种格式之间的差异,一句话就能说清楚,但一旦弄错,播放就会出问题。如果你想在选之前看清楚全貌,可以参考这篇WebVTT和SubRip的详细对比。
SubViewer和ASS,各有各的用途
SubViewer,文件后缀是.sbv,是YouTube Studio导出字幕时用的格式。你并没有主动选它,只是点了下载,拿到的就是这个。它完全没有字幕编号,时间行里的两个时间点用逗号隔开而不是箭头,小时数也不会补零。这个格式本身没问题,只是除了它的“娘家”之外,几乎没有别的地方愿意读它。
这就决定了SBV更像是个中转站,而不是终点。如果你是从YouTube Studio里把字幕导出来准备用在别处,转成SubRip既快又安全,这里有个专门做SBV转SRT的工具,只做这一件事。
什么时候真的需要ASS或SSA
SubStation Alpha,文件后缀是.ssa或.ass,是给“需要好看”的字幕用的格式。它能承载样式、位置信息和卡拉OK式的逐字效果,这些都放在一个结构化的Events区块里。有一个细节值得知道,即使你从不打开这个文件也一样:Events区块会在文件内部自己声明列的顺序,所以任何读取它的程序都得先读这行声明,不能凭空假设时间信息和文字分别放在哪一列。
当字幕的“样子”本身就是内容的一部分时,你才需要ASS或SSA:比如把画面里的标牌翻译并叠加在原位、两个说话人用不同颜色区分、文字要精确落在画面的某个位置上。如果你的字幕只是屏幕下方的普通对话,就不需要用它,用了反而会让文件在别的地方更难被接受。
决定转换有没有代价的那条规则
不同格式能表达的信息不一样。只有当目标格式能装下源格式里的全部信息时,转换才是零成本的。装不下的时候,多出来的那部分信息不会打折保留,而是直接消失。
从功能更丰富的格式转换成SubRip,注定是有损转换。样式、位置和特效在一个根本没办法描述它们的格式里无处安放,转换工具只能把它们丢掉。留下来的是时间轴和文字内容,对大多数用途来说,这本身就是文件的核心。但这种损失在转换后的文件里是永久的,以后再转回去,也换不回原来的样式,只会得到一个没有样式、换了个后缀名的文件。
反过来,SubRip转WebVTT是零损失的。转换过程只是加上WEBVTT这一行文件头,再把毫秒的分隔符从逗号改成句点。字幕编号会被去掉,因为WebVTT把编号当成可选项,它本身也不携带任何有用信息——字幕的先后顺序本来就已经说明了编号想说明的事。没有任何实质内容会丢失,这也是为什么这个方向的转换你完全不用多想。
由此得出一个习惯:务必保留原始文件。转换的时候转一份副本。如果带样式的ASS文件是你唯一保留位置信息的地方,那么用SRT把它覆盖掉,就是一个只能做一次的决定。
说到具体转换,本站的免费字幕转换工具完全在你的浏览器里运行,不会上传任何文件,也不需要注册账号。不过这类浏览器工具只能转换文本文件,不能把音频转成文字;如果你手里只有一段没有字幕文件的视频,SozAI这款支持iOS、Android和macOS的转录应用,可以把文件、录音和YouTube链接直接转成带说话人标注、摘要和翻译的文字内容,支持99+种语言。
怎么判断一个字幕文件到底是什么格式
后缀名不能证明文件内容。一个从.vtt改名成.srt的文件,本质上依然是WebVTT,你只是换了个标签而已。这一点很关键,因为播放器拒绝识别文件时,大多数人第一反应就是改后缀名,而这恰恰是唯一保证没用的办法。播放器根本不看文件名,它看的是文件开头几行,一旦发现文件头或分隔符和预期的不一样,就直接放弃了。
用任何一个纯文本编辑器打开文件,看开头几行就知道了:
- 第一行是WEBVTT:不管后缀名写的是什么,它就是WebVTT。
- 单独一行的编号,后面跟一行时间信息、毫秒前是逗号:SubRip。
- 没有编号,两个时间点用逗号隔开,小时数没有补零:SubViewer。
- 有一个Events区块,里面有一行专门声明列顺序:某种形式的SubStation Alpha。
花三十秒看一眼,能省下大量猜测的时间,还能顺便发现下载到的文件其实和按钮上写的不是一回事。
转换格式解决不了的问题
转换改变的是“容器”,不是“内容”。如果时间轴和视频本身就有偏差,转换之后偏差还是一样在,因为转换工具只是照搬给它的数字,根本不知道视频画面长什么样。拼错的名字、漏掉的台词、时长设置得太长的字幕条,全都会原样保留下来。
转换也不能说服播放器接受它本来就不支持的格式。如果一个网页播放器只认WebVTT,你把SBV转成SRT,得到的确实是一个接受度更广的格式,但对这个具体的目的地来说,它依然是错的。转换的方向应该看目的地要什么,而不是看哪个格式更常见。
另外,反向转换永远无法找回有损转换丢掉的东西。样式和位置信息一旦从文件里消失,唯一还留着它们的地方就是原始文件——前提是你留了一份。如果你在处理带样式的字幕,把ASS或SSA文件当成“母版”,从它导出的所有文件都当成用完就可以丢的东西。这样,一次转换失误付出的代价只是一分钟,而不是一整个下午。

