SRT 和 VTT 有什么区别(附互转方法) blog cover illustration

SRT 和 VTT 有什么区别(附互转方法)

SRT 和 VTT 的区别可以一句话概括:两者都是放在视频旁边的纯文本字幕文件,但 SRT(SubRip)是几乎所有平台都认的通用格式,而 VTT(WebVTT)是专为 HTML5 网页播放器设计的网页原生格式。如果你在纠结该用哪种——或者上传错了格式、字幕根本没显示出来——你会发现 SRT 和 VTT 的差别比想象中小:主要就是一行文件头、时间戳里逗号还是句点、以及各自支持多少样式。本文会给你真实的文件对照示例、一张各平台速查表,以及如何把 SRT 转成 VTT(以及反向转换)而不把字幕搞坏的具体做法。

如果你只想要结论:需要最大兼容性、想省事上传时用 SRT;目标是网页自带的视频播放器、或某个明确要求 WebVTT 的平台时用 VTT。继续往下看那些会悄悄吃掉字幕的坑——用错的小数分隔符、缺失的文件头、以及编码不对导致的乱码。

核心要点

  • 把文字稿或 SRT 当作母版资产;字幕、摘要、翻译和切片都依赖它。
  • 复用到多平台前,先校对人名、数字、术语和时间轴。
  • 按发布目的选择 SRT、VTT 或硬字幕,而不是凭习惯。
  • 移动端字幕优先保证短行、高对比和安全区位置,装饰性放后面。

SRT vs VTT 速览

整场对比就在这一张表里,下面每一节只是用真实示例把这些行讲清楚。

SRT 和 VTT 有什么区别(附互转方法) 文章详情图:SRT vs VTT anatomy

特性 SRT(SubRip) VTT(WebVTT)
文件扩展名 .srt .vtt
必需的首行 WEBVTT
毫秒分隔符 逗号——00:00:01,000 句点——00:00:01.000
序号 惯例上按顺序编号 可选
定位 / 对齐 规范里没有 有(linepositionalign
行内样式 非官方,看播放器 有(标签 + STYLE 块)
注释(NOTE
天然归宿 离线播放器、大多数上传框 HTML5 <track>、网页播放器
编码 建议 UTF-8 必须 UTF-8

一句话总结:SRT 是朴素、便携的格式;VTT 是更丰富、面向网页的格式。十有八九你能在几秒内完成互转,因为字幕文字是一模一样的——变的只是外壳。

SRT 文件到底长什么样

用文本编辑器打开任意一个 .srt,你会看到不断重复的四行小块:一个序号、一段时间戳区间、字幕文字,再加一个空行。就这些。

1
00:00:01,000 --> 00:00:04,000
Welcome back to the channel.

2
00:00:04,000 --> 00:00:07,500
Today we're breaking down three quick edits.

有三点值得注意:

  1. 每个小块都编了号,从 1 开始按顺序排。
  2. 时间戳在毫秒前用逗号00:00:01,000。这个细节是转换失败最常见的原因。
  3. 没有文件头,也没有样式。 SRT 只有文字和时间。有些桌面播放器会认 <i><b> 这类非官方标签,但这不属于格式本身,所以千万别指望它。

这份朴素正是 SRT 的杀手锏。因为几乎没什么可被误读的东西,它能干净地上传到最广泛的目的地。

VTT(WebVTT)文件到底长什么样

WebVTT 是 SRT 的网页原生表亲。同样的字幕在 .vtt 里看起来几乎一样——但有三处刻意的改动。

WEBVTT

1
00:00:01.000 --> 00:00:04.000
Welcome back to the channel.

2
00:00:04.000 --> 00:00:07.500 line:90% align:center
Today we're breaking down three quick edits.

找出它和上面 SRT 的不同:

  1. 首行是 WEBVTT,后面跟一个空行。VTT 文件没有它就是无效的,网页播放器会悄悄忽略一个缺头的文件。
  2. 毫秒分隔符是句点,不是逗号:00:00:01.000
  3. 每条 cue 可以带设置。 第二条上的 line:90% align:center 把字幕在画面里定位并对齐——这是 SRT 根本表达不出来的。

在 webvtt vs srt 的对比里,这就是 VTT 的全部优势:它是为浏览器设计的,所以能携带定位、对齐、行内样式标签、带 CSS 的 STYLE 块、供你自己参考的 NOTE 注释,甚至章节或元数据轨道。如果这些对你的上传都不重要,那这些额外能力只是用不上的负担——这也是为什么不少创作者干脆一直用 SRT。

真正把人绊倒的几处差异

大多数"SRT vs VTT"的搞混都归结为四件小事。把这几件做对,转换就不会再失败。

SRT VTT 会出什么问题
小数分隔符 逗号 , 句点 . 把 SRT 时间戳原样贴进 VTT,播放器会拒收这条 cue
文件头 首行 WEBVTT 没头的 VTT 一条字幕都不显示
样式 / 定位 只有文字 cue 设置 + CSS SRT→VTT 样式保得住,VTT→SRT 会被抹掉
编码 建议 UTF-8 必须 UTF-8 非 UTF-8 会把带音标和非拉丁文字变成乱码

有几点值得记牢:

  • 逗号与句点的互换,是"我的 VTT 不显示"的头号原因。 文件里的每一个时间戳都得符合格式,不是只改开头那个就行。
  • VTT 能装 SRT 表达不了的样式。 所以 VTT → SRT 天生是有损的:定位、对齐、CSS 都会被压平成纯文字。反过来 SRT → VTT 是安全的,因为你只是加了个外壳。
  • 编码在出问题之前一直是隐形的。 两种格式都应保存为 UTF-8。用旧的 Windows 编码保存的文件,看英文没事,但会把带音标的字符、emoji 和任何非拉丁文字弄成乱码。

各平台该用哪种格式

这才是创作者真正会去搜的问题:我要发到某个地方,到底该传哪种文件?下面是实用对照。

SRT 和 VTT 有什么区别(附互转方法) 文章详情图:Subtitle format decision tree

目的地 首选格式 说明
YouTube(长视频) SRT(也收 VTT) SRT 是最省心可靠的上传;播放器支持开关
网页播放器(HTML5 <track> VTT(必须) <track> 元素只认 WebVTT——SRT 加载不了
LMS / 课程平台 通常是 VTT 多数课程播放器基于 HTML5,因此要 VTT
TikTok、Reels、YouTube Shorts 都不用——烧录 没有字幕文件上传框,改为把字幕渲染进画面

从这张表能得出两条经验法则:

  1. 如果是浏览器在直接播放视频——你自己的网站、落地页、LMS——你基本上都需要 VTT,因为 HTML5 的 <track> 元素只说 WebVTT。
  2. 如果是上传到大平台自己的播放器,SRT 是安全默认项,而 YouTube 两种都乐意收。在短视频竖屏信息流里,压根没有字幕文件框,所以你要把字幕烧进像素里——就是我们在 如何给视频加字幕 一文里讲的开放式字幕做法。

留一份干净的 SRT 当母版,你就能从它派生出任何目的地所需要的格式。这正是本文接下来要搭起来的工作流。

如何把 SRT 转成 VTT(以及反向)

转换很快,因为字幕文字从头到尾不变——你只是在改外壳。有两条靠谱的路:用浏览器转换器一步得到干净正确的文件,或者手动改一遍,好搞清楚到底改了什么。

一步到位的浏览器路线

如果你连文本编辑器都不想碰,就把文件丢进一个能替你处理文件头、分隔符和编码的转换器:

  1. SRT → VTT:.srt 拖进 SRT 转 VTT 转换器。它会加上 WEBVTT 头、把每个逗号换成句点,并保存为 UTF-8。
  2. 其他格式 → SRT: 如果你手头是 .vtt.ass 或别的字幕文件、需要那个通用格式,就用 字幕转 SRT 转换器 把它压平成干净的 SRT。
  3. 顺手把观感调好: 如果你要烧录字幕、或想要统一的屏上样式,打开 字幕样式编辑器,在导出前设好字体、字号、描边和位置。

因为 Recapo 完全在浏览器里运行——无需安装,支持 MP4、MOV 及其他常见格式,单个任务最高 6GB——你可以在同一个地方,从原始视频一路做到带字幕的成品和对应的字幕文件。

手动路线(好让你知道发生了什么)

手动把 SRT → VTT,实打实就是三步:

  1. 在所有内容最上方,加一行 WEBVTT,再空一行。
  2. 把时间戳里的每个逗号都换成句点(00:00:01,00000:00:01.000)。用查找替换,但只针对时间戳那几行,别动到字幕文字里的逗号。
  3. 以 UTF-8 编码保存,扩展名用 .vtt

反过来把 VTT → SRT,步骤相反,但有一个注意点:

  1. 删掉 WEBVTT 头,以及任何 NOTESTYLEREGION 块。
  2. 把时间戳里的句点换回逗号。
  3. 把时间戳行上的 cue 设置(比如 line:90% align:center)去掉,因为 SRT 用不了它们。
  4. 以 UTF-8 编码保存,扩展名用 .srt

注意点在于:第 3 步正是 VTT 的样式和定位丢失的地方。如果这些格式对你重要,就留着 VTT,别往下降级。

常见转换坑(以及怎么躲开)

即便一次"成功"的转换,也可能在播放时悄悄翻车。下面这四个最常咬到创作者。

SRT 和 VTT 有什么区别(附互转方法) 文章详情图:Subtitle conversion workflow

  • 编码乱码。 如果带音标的字母或非拉丁字符变成了 é 或方块,说明文件没存成 UTF-8。用 UTF-8 编码重新保存。如果你还要把字幕翻译成其他语言,这一点尤其关键——完整流程见我们的 如何翻译字幕
  • BOM 问题。 文件最开头的字节顺序标记(BOM)会把 WEBVTT 头挤出首行的位置,于是一条字幕都加载不出来。如果一个看起来没问题的 VTT 什么都不显示,就把它重新存成"UTF-8 无 BOM"。
  • 只转了一半的时间戳。 查找替换哪怕漏掉一个逗号,都会留下一条坏 cue。转换后从头扫一遍,或者用一个能保证每一行都处理到的专用转换器。
  • 样式无声无息地丢了。 VTT → SRT 会把定位和样式丢掉,却不报任何错——文件只是比预期更朴素。事先想清楚你是否需要那份样式,如果需要,就交付 VTT 而不是 SRT。

有个习惯能防住其中大部分问题:把你那份准确、改对的 SRT 当作权威母版文件。只在网页播放器或 LMS 要求时才从它派生出 VTT,烧录字幕时从它重新调样式,每次翻译都复用它。弄丢这份母版就意味着从头重新转录——所以如果你在自动生成字幕,请从一份可靠的转录稿开始,我们盘点的 最佳自动字幕生成器 能帮你挑一个。

常见问题

SRT 和 VTT 最主要的区别是什么? 两点。VTT 文件必须以 WEBVTT 头开头,并在毫秒前用句点(00:00:01.000);而 SRT 没有文件头,用逗号(00:00:01,000)。VTT 还能携带 SRT 表达不了的定位和样式。至于字幕文字本身,两者完全一样。

我能不能直接把 .srt 改名成 .vtt 不能。改扩展名不会加上必需的 WEBVTT 头,也不会把逗号改成句点,网页播放器会拒收它。先用转换器跑一遍,或者手动做那两处修改。

YouTube 用的是 SRT 还是 VTT? 长视频上传两种都收,观众可以自行开关字幕。SRT 是最省心可靠的选择。而 Shorts 等竖屏信息流没有字幕文件上传口,所以你要把字幕直接烧进视频里。

网站视频播放器用 SRT 还是 VTT 更好? 毫无疑问是 VTT——HTML5 的 <track> 元素只认 WebVTT,SRT 在浏览器原生播放器里根本加载不了。嵌入前先把 SRT 转成 VTT。

把 SRT 转成 VTT 会降低画质吗? 不会。字幕是纯文本,转换完全不碰你的视频和音频。风险只在于漏了个逗号或编码不对导致文件坏掉——而不是任何画质损失。反方向(VTT → SRT)可能丢掉样式和定位,但同样不影响画面。

用干净的方式转换你的字幕

SRT 和 VTT 是同一份字幕的两个外壳——把文件头、分隔符和编码弄对,哪一个都能用。留一份准确的 SRT 当母版,网页播放器或课程平台要 VTT 时再派生一份,竖屏信息流就把字幕烧进去。免费注册 Recapo,在浏览器里转录、转换、调样式并导出你的字幕,然后把同一份母版文件复用到你发布的每一个平台。

参考来源与延伸阅读

推荐文章