SRT 转 VTT 在线怎么转?差异与三种做法

手上一条 SRT,想在网页里播放或者上传到只认 WebVTT 的平台,就会被拦下来。两种格式看着只差一个扩展名,实际在头信息、时间码写法和样式支持上都不一样。先弄清楚差异,再选做法,能少走很多弯路。

这个问题在出海场景尤其常见——同一段成片要同时上架网页端和本地播放器,两种格式都得备齐。

SRT 与 VTT 的差异对比
SRT 与 WebVTT 在头信息、时间码小数点和样式支持上的关键差异,以及三种转换路径各自适用的场景

SRT 与 VTT 到底差在哪

两者都是纯文本、条目化的字幕。但 VTT 有几点 SRT 没有:

  • 文件头:VTT 第一行必须是 WEBVTT,SRT 没有这个要求
  • 时间码分隔符:SRT 用逗号 , 分隔毫秒(如 00:00:01,000),VTT 用小数点 .(如 00:00:01.000
  • 样式与定位:VTT 支持 <c> 着色、<b> 加粗等内联标签,以及按 cue 设置位置,SRT 基本只承载纯文本
# SRT
1
00:00:01,000 --> 00:00:02,500
今天聊三个问题

# VTT
WEBVTT

00:00:01.000 --> 00:00:02.500
今天聊三个问题

注意 VTT 的条目之间也用空行分隔,但序号是可选的——规范里不要求写 1、2、3。直接把 .srt 改名成 .vtt 多半不可用,播放器会因为缺头信息和时间码格式不符而报错。

还有一个容易忽略的点:部分平台虽然写着支持 VTT,实际只认特定写法,比如要求每条 cue 都有编号、或拒绝某些内联样式。遇到上传报错,先确认是"格式不合法"还是"样式不被支持",前者才是转换问题,后者是平台限制。不要把平台侧的样式限制误当成转换失败。

做法一:在线转换(最省事)

不想装软件、只是偶尔转一次,用在线工具最省事。以 SmileSub 的 SRT 转 VTT 工具 为例,不用登录:

  1. 上传 SRT 文件
  2. 等待解析与转换完成
  3. 下载 VTT 文件,条目数与时间轴保持不变

转换只动格式、不动内容,原来的中文或英文文本原样保留。免费额度为单文件不超过 1MB、不超过 500 条字幕,每个工具每个 IP 每天 3 次。

如果你手上的字幕还要加样式、定位到画面特定位置,那已经超出 SRT 的能力范围,需要的是 SRT 转 ASS 工具 而不是 VTT。

做法二:播放器直接挂载

很多网页播放器(以及浏览器原生的 <video> + <track>)只接受 VTT。如果你只是想在网页里展示字幕,不必把源文件转来转去:

  • 在 HTML 里用 <track> 指向 VTT 文件
  • 或把 VTT 作为独立轨道上传到支持它的平台

这条路线的前提是平台本身就吃 VTT。如果你要交付的是 .srt 给客户,那还是得做文件转换。

更完整的字幕格式选择,可以看 《硬字幕还是软字幕?》 这篇。

做法三:命令行批量

同一批视频几十上百条字幕要转,命令行更稳。常见做法是 ffmpeg 一句转封装:

ffmpeg -i input.srt output.vtt

它同样会补上 WEBVTT 头、把逗号改成小数点。但命令行对输入文件的格式要求更严格——源 SRT 一旦有重叠、序号错乱之类的问题,转出来的 VTT 也会带着同样的问题。转之前建议先用 字幕规范检查工具 过一遍。

另外提醒:ffmpeg 转换不会帮你修源文件本身的问题,它只是格式搬运。源 SRT 有脏数据时,先清理再转,结果才干净。

三种做法怎么选

你的场景 建议做法 主要代价
偶尔转一次、不想装软件 在线工具 几乎为零
网页里展示、平台吃 VTT 播放器挂载 需要平台支持
几十上百条批量 命令行 要会基础命令、源文件得干净

一句话:在线转适合临时、少量;播放器挂载适合网页呈现;命令行适合批量与自动化。

先从最小代价的做起,不够再升级,是更稳的节奏。

常见问题

改个扩展名能不能直接用?

基本不能。VTT 缺了 WEBVTT 头、时间码还是逗号分隔,大多数播放器会直接忽略或报错。必须用真正的转换补上这些差异。

转完为什么字幕位置变了?

SRT 不带位置信息,转 VTT 不会凭空多出定位。如果你看到字幕位置异常,通常是播放器自己的默认样式,而不是转换造成的。需要精确控制位置得用 ASS。

在线转换会改我的文字内容吗?

不会。转换只改格式层(头信息、时间码分隔符、可选序号),文本原样保留。文字本身的翻译或校对是另一回事,那要用翻译类工具。