VTT 转 SBV
或者粘贴字幕文本
这次转换会改变什么
有 2 项会被丢弃或需要你决定
- 样式
全部样式(粗体、斜体、颜色、描边、阴影)
- 格式专有内容
源格式保留在字幕条之外的内容(非字幕块、文件头文字、单条字幕的设置、被注释掉的事件)——目标格式没有地方存放它们
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
SBV 是 YouTube 早期导出的字幕格式:一行两个时间码、逗号分隔,下面是正文,没有序号也没有文件头。VTT 转 SBV 基本是把 WebVTT 的写法还原成这种最简结构。
两边的时间精度是一致的,都写到毫秒,所以 `00:00:04.126` 出来是 `0:00:04.126`,不取整也不挪位。一条 cue 仍是前后两个时间,中间用逗号;两行的字幕仍是两行,行与行的归属关系保留。行内的 `<i>`、`<b>`、`<u>`、`<font color>` 这类文字级标签会跟着正文进产物,因为它们本来就写在文本里。
丢的是 WebVTT 的文档层:`WEBVTT` 头部、`NOTE`/`STYLE`/`REGION` 块、cue 标识符,以及时间码后面的 `align:start`、`position:10%` 等 setting。SBV 存的是 cue,不是文档,也没有样式表能放全局规则。这些会在有损说明里逐条列出,文件加载后还会告诉你实际丢了几处。
cue 会按开始时间排序,乱序文件会被排好。整季文件一次拖入,串行处理、可随时取消、最后打包成一个 ZIP;转换全程在本机浏览器里完成,文件不上传。
示例
一份典型的 VTT 转成 SBV
输入
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>.
输出
0:00:01.000,0:00:04.000
Hello there.
0:00:04.500,0: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.
输出
0:00:01.000,0:00:02.000
No header, two lines before the timecode.
真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
VTT 转 SBV 后,cue 的标识符(比如 intro)还在吗?
不在。SBV 的每条字幕只有一行时间码加正文,没有序号行,也没有标识符的写法,所以 `intro`、`sign-1` 这类名字会丢掉。
VTT 转 SBV 时毫秒会被取整吗?
不会。两边都写到毫秒,`00:00:04.126` 变成 `0:00:04.126`,只是少了小时的两位前导零。时长也一样,屏幕上待了 2.9 秒的 cue 还是 2.9 秒。
VTT 的 WEBVTT 头与 NOTE、STYLE、REGION 块转成 SBV 后呢?
都被丢弃。SBV 没有头部、没有块语法,也没有样式表;`WEBVTT` 那一行、注释块、样式块与区域定义都没有落点。cue 本身完整保留。
VTT 转 SBV 后,行内的粗体和斜体标签还在吗?
在。`<i>`、`<b>`、`<u>`、`<font color="…">` 是写在正文里的标签,SBV 不解析也不改写它们,所以原样跟着文本进产物。丢的是文件级声明的样式,不是这些标签。
VTT 时间码后的 align:start、position:10% 在 SBV 里怎么表示?
没有办法表示,会被丢弃。SBV 既没有 cue setting 也没有定位字段,屏幕上的位置完全由播放器决定,所以这些 setting 只会在有损说明里列出。
整季 VTT 一次转成 SBV 可以吗?
可以。一次拖入多个文件,队列串行处理,可随时取消,结束后打成一个 ZIP 下载。整个过程在浏览器里完成,字幕文件不会上传到任何地方。