VTT 转 SRT
或者粘贴字幕文本
这次转换会改变什么
有 2 项会被丢弃或需要你决定
- 样式
全部样式(粗体、斜体、颜色、描边、阴影)
- 格式专有内容
源格式保留在字幕条之外的内容(非字幕块、文件头文字、单条字幕的设置、被注释掉的事件)——目标格式没有地方存放它们
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
VTT 转 SRT 是这一站最常见的转换之一。两种格式装的东西几乎一样,差别主要在写法上,所以时间轴和文字基本能原封不动地带过去。
时间精度不用妥协:两边都写到毫秒,唯一的改动是小数点——`00:00:01.000` 变成 `00:00:01,000`,因为 SRT 在秒与毫秒之间用逗号。cue 会重新编号成 1、2、3,因为 SRT 的计数器按惯例必须是数字,严格的解析器会拒绝非数字的序号;WebVTT 里那些自由形式的标识符(比如 `intro`、`sign-1`)因此不会保留。
带不过去的是 WebVTT 放在 cue 之外的东西:`WEBVTT` 头部(可能还跟着一句注释)、`NOTE`/`STYLE`/`REGION` 块,以及时间码后面的 `align:start`、`position:10%` 这类 setting。其中 `STYLE` 块最值得留意——它常常装着整份文件的版式规则,而不只是一句随手的注释;如果播放器依赖它,就得另找地方安置。产物需要屏幕定位时,改用 ASS 更合适:那边定位写在 `\an7`、`\pos` 这样的覆写码里,会跟着文本一起走。
脏文件也能读:缺头部、Windows 换行、时间码前多一行、带 BOM 都不报错。整季文件批量转换、可中途取消、结果打成一个 ZIP;全程在浏览器里完成,文件不会上传。
示例
一份典型的 VTT 转成 SRT
输入
WEBVTT
intro
00:00:01.000 --> 00:00:04.000
Hello there.
00:00:04.500 --> 00:00:08.000 align:start position:10%
Second line with <i>italics</i>.
输出
1
00:00:01,000 --> 00:00:04,000
Hello there.
2
00:00:04,500 --> 00:00:08,000
Second line with <i>italics</i>.
这份产物丢掉了样式与格式私有内容;其余部分逐行一致。
同一转换遇到一份不规范但可读的输入
输入
a stray comment line
cue-id-1
00:00:01.000 --> 00:00:02.000
No header, two lines before the timecode.
输出
1
00:00:01,000 --> 00:00:02,000
No header, two lines before the timecode.
真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
VTT 转 SRT 后,时间会被改动吗?
不会。WebVTT 的 `00:00:01.250` 与 SRT 的 `00:00:01,250` 是同一个时刻的两种写法,每个开始与结束时间都原样带到毫秒,变的只是秒与毫秒之间那个字符。
VTT 转 SRT 后,cue 的标识符还在吗?
不在,会重新编号成 1、2、3。WebVTT 允许 `intro`、`sign-1` 这类自由标识符,转换器也读得出来,但 SRT 的计数器按惯例必须是数字,严格的解析器会拒绝非数字序号,所以不照搬。
VTT 的 WEBVTT 头与 NOTE、STYLE、REGION 块在 SRT 里怎么处理?
全部丢弃。SRT 没有头部行,也没有块语法,没有地方放它们。其中 `STYLE` 最要紧——它可能装着整份文件的版式规则,而不只是一句注释,播放器如果依赖它,就得另找地方安置。
VTT 时间码后的 align:start、position:10% 转成 SRT 后去哪了?
被丢弃。SRT 无法把一条字幕放到屏幕上的指定位置。如果产物需要定位,改成转 ASS 更合适:那边定位写在 `\an7`、`\pos` 这类覆写码里,会跟着文本走。
VTT 转 SRT 后,产物的排版会被统一吗?
会。产物每次都以同一套整洁结构写出,与源文件原来的换行和多余空白无关;同一份源文件重复转换,得到的排版也一样。
受保密协议约束的 VTT 能在这页转成 SRT 吗?
能。解析和写出都在浏览器标签页里完成,没有任何上传步骤,也没有服务端解析;页面加载过之后断网还能继续转换,产物直接写在本机。