SBV 转 JSON
或者粘贴字幕文本
这次转换会改变什么
这个方向不会丢失内容 —— 源格式的每一项特性在目标格式里都有地方可去。
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
这一页把 SBV 转成本站的 JSON schema:给脚本和流水线读的字幕表示,时间不做成时间码字符串,而是整数毫秒。
结构是 `version` 加一个 `cues` 数组。每条 cue 有 `start`、`end`(整数毫秒)和 `lines` 数组;SBV 的 `0:00:04.126` 读进来是 `4126`。两行的字幕在 `lines` 里就是两项,不会被拼成一段。schema 里有一个 `id` 字段,用来放有标识符的格式(比如 WebVTT 的 `intro`);SBV 没有标识符语法,所以这里的条目不会凭空多出 id。
这一方向没有损失:SBV 能表达的东西——时间、文本、行——schema 都装得下,所以有损说明是空的。反方向则不是:JSON 转 SBV 会丢掉样式、定位与卡拉OK,因为 SBV 只存 cue。也就是说,这份产物本身不丢东西,代价只在你转回去的时候出现。
脏输入照样能读:CRLF、时间码前带制表符、结尾没有换行,都不会报错。整季文件批量转换、可随时取消、最后打成一个 ZIP;解析和写出都在浏览器里,文件不上传。
示例
一份典型的 SBV 文件转成 JSON
输入
0:00:01.000,0:00:03.500
The quick brown fox.
0:00:04.000,0:00:06.250
Jumps over the lazy dog.
0:00:07.000,0:00:09.000
Two lines here.
And a second one.
输出
{
"version": 1,
"cues": [
{
"start": 1000,
"end": 3500,
"lines": [
"The quick brown fox."
]
},
{
"start": 4000,
"end": 6250,
"lines": [
"Jumps over the lazy dog."
]
},
{
"start": 7000,
"end": 9000,
"lines": [
"Two lines here.",
"And a second one."
]
}
]
}
这一方向没有丢任何东西:左右两边逐行对照即可。
同一转换遇到一份不规范但可读的输入
输入
0:00:02.000,0:00:04.000
Carriage-return line endings.
0:00:06.000,0:00:08.000
Indented timecode, no final newline.输出
{
"version": 1,
"cues": [
{
"start": 2000,
"end": 4000,
"lines": [
"Carriage-return line endings."
]
},
{
"start": 6000,
"end": 8000,
"lines": [
"Indented timecode, no final newline."
]
}
]
}
真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
SBV 转 JSON 为什么是无损的?
SBV 只有 cue:两个时间和一段文本。这个 schema 的每条 cue 恰好有 `start`、`end` 与 `lines`,能完整接住这三样,所以没有东西会消失,有损说明是空的。
SBV 的 0:00:04.126 在 JSON 里是什么?
是 `4126`,整数毫秒。全站统一用整数毫秒做时间单位,所以产物里没有时间码字符串,也不需要取整——两边本来都到毫秒。
SBV 里两行的字幕在 JSON 里怎么表示?
放在同一条 cue 的 `lines` 数组里,占两项。归属关系保留,下游脚本能分辨“同一条里的两行”和“两条不同的字幕”。
SBV 转 JSON 后 cue 里有 id 吗?
没有。schema 确实有 `id` 字段,但它用来放源格式自带的标识符——SBV 没有这种写法,所以条目里只有 `start`、`end` 和 `lines`。WebVTT 转 JSON 时那个字段才会出现。
SBV 转 JSON 的产物结构是什么?
一个 `version`(当前是 1)加一个 `cues` 数组,每条 cue 是一个对象,字段是整数毫秒与字符串数组。产物是纯 JSON,没有注释也没有尾逗号,可以直接交给脚本。
整季 SBV 能一次转成 JSON 吗?
能。多个文件一次拖入,队列串行处理,中途可以取消,结束后打成一个 ZIP 下载;每份产物都是独立的 JSON 文档。全程在浏览器里,文件不上传。