VTT 转 JSON
或者粘贴字幕文本
这次转换会改变什么
有 1 项会被丢弃或需要你决定
- 格式专有内容
源格式保留在字幕条之外的内容(非字幕块、文件头文字、单条字幕的设置、被注释掉的事件)——目标格式没有地方存放它们
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
这一页把 WebVTT 转成本站的 JSON schema——一种给脚本和流水线读的字幕表示,不是给播放器的。时间不做成时间码字符串,而是整数毫秒;一条 cue 的多行保持分开,不拼成一段。
结构很短:一个 `version`,加一个 `cues` 数组;每条 cue 有 `start`、`end`(整数毫秒)和 `lines`。行内格式不丢,`<i>` 斜体变成行对象里的 `tags`,带 `kind` 与字符区间:`italics` 这一段会记成 `{"kind":"italic","start":17,"end":24}`。WebVTT 的 cue 标识符也有地方放——这个 schema 有 `id` 字段,所以 `intro` 转过去还是 `intro`,这一点与 VTT 转 SRT 不同,那边会把序号重编成数字。
丢的东西只剩下 cue 之外的部分:`WEBVTT` 头部与它后面的注释、`NOTE`/`STYLE`/`REGION` 块,以及时间码后的 `align:start`、`position:10%` 这类 setting。它们不会被塞进某个空闲字段,而是被计数后列在上方;文件一加载,就能看到这份文件里实际有几处。
毫秒两边完全对得上,`00:00:01.234` 读进来是 `1234`,不做任何取整。脏输入照样能读:缺头部、CRLF、时间码前的杂行、BOM 都不报错。整季文件批量转换、可取消、结果打成一个 ZIP;过程全在浏览器里,文件不上传。
示例
一份典型的 VTT 转成 JSON
输入
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>.
输出
{
"version": 1,
"cues": [
{
"id": "intro",
"start": 1000,
"end": 4000,
"lines": [
"Hello there."
]
},
{
"start": 4500,
"end": 8000,
"lines": [
{
"text": "Second line with italics.",
"tags": [
{
"kind": "italic",
"start": 17,
"end": 24
}
]
}
]
}
]
}
这份产物丢掉了格式私有内容;其余部分逐行一致。
同一转换遇到一份不规范但可读的输入
输入
a stray comment line
cue-id-1
00:00:01.000 --> 00:00:02.000
No header, two lines before the timecode.
输出
{
"version": 1,
"cues": [
{
"start": 1000,
"end": 2000,
"lines": [
"No header, two lines before the timecode."
]
}
]
}
真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
VTT 转 JSON 后,cue 的标识符会保留吗?
会。WebVTT 允许在 cue 前写一个自由形式的标识符(比如 `intro`、`sign-1`),这个 schema 有 `id` 字段承接它,所以原样写出。同样的文件转成 SRT 就会被重编号,因为 SRT 的计数器必须是数字。
VTT 转 JSON 后时间为什么是 1000 这样的整数?
这是全站统一的时间单位:整数毫秒。`00:00:01.000` 对应 `1000`,没有时间码字符串,也没有取整——VTT 与 JSON 两边都到毫秒,读进来再写回去是同一个数。
VTT 里的 <i> 斜体在 JSON 里怎么表示?
写成行对象的 `tags`:文本本身留在 `text`,区间另记为 `{"kind":"italic","start":17,"end":24}`。粗体、下划线、颜色同理,字符偏移从 0 起算,不改变文本。
VTT 转 JSON 会丢掉什么?
只有 cue 之外的东西:`WEBVTT` 头部与注释、`NOTE`/`STYLE`/`REGION` 块,以及时间码后的 `align:start`、`position:10%` 等 setting。schema 是照着 cue 模型建的,几乎覆盖了 WebVTT 在 cue 内的全部内容。
VTT 转 JSON 后,两行的字幕会被合并成一段吗?
不会。每条 cue 的 `lines` 是数组,两行就是两项,硬换行不会被抹掉。这样下游脚本还能分辨“同一条里的两行”和“两条不同的字幕”。
VTT 转 JSON 的产物可以直接给脚本读吗?
可以。产物就是一份纯 JSON 文档:`version` 加 `cues` 数组,没有注释、没有尾逗号。整季文件也能批量转,队列串行、可取消,最后打成一个 ZIP;文件始终留在本机。