字幕格式转换
SRT、WebVTT、ASS/SSA 三种字幕格式互转,并可整体平移时间轴修正不同步。全部在浏览器里完成,并直说每种格式带不过去什么。
在你的浏览器中运行
负值表示字幕提早出现。会被推到零之前的字幕会停在零,不会被丢掉。
没有带过去的东西
解析与输出都在你的浏览器里完成,文件不会上传。
三种格式,同样三件事
常见的字幕格式记的都是同样的东西——起始时间、结束时间、一段文字。它们在「怎么写下来」这件事上 几乎每个细节都不一样:
| SRT | WebVTT | ASS/SSA | |
|---|---|---|---|
| 文件头 | 没有 | 必须是 WEBVTT | [Script Info] |
| 时间戳 | 00:01:02,500 | 00:01:02.500 | 0:01:02.50 |
| 精度 | 毫秒 | 毫秒 | 百分秒 |
| 编号 | 每条都有 | 没有 | 没有 |
| 换行 | 直接换行 | 直接换行 | \N |
| 样式 | <i>、<b> | <i>、CSS | 自成一套样式引擎 |
把文件贴到上面,格式会自动辨识。没有东西被上传——解析和输出都在这个分页里完成。
修正字幕不同步
这才是大多数人打开字幕转换器的真正理由,而它只是一个数字。输入差多少秒,全部字幕就一起移动。
- 字幕出现得太晚 → 填负数。
- 字幕出现得太早 → 填正数。
会被推到零之前的字幕会停在零,而不是被丢掉。会推到负数的平移量通常本来就填错了,而悄悄少掉前 三句话只会让你更晚发现。
固定平移只能修固定的偏差。 如果字幕是「愈到后面差愈多」,那是帧率不合——通常是 23.976 对 25——再怎么平移都对不上。那需要改变速率,这个工具不做。
每一种转换会失去什么
页面会针对你实际贴上的文件列出来,而不是让你事后才发现。
ASS 转 SRT 或 WebVTT,会失去 ASS 之所以是 ASS 的一切。 字体、颜色、位置、卡拉 OK 逐字、
跟着镜头移动的招牌特效——全部都在样式引擎里,没有任何对应。{\an8}、{\pos(…)} 这类覆写标签
会被移除而不是留成文字,\N 会变成真正的换行。
WebVTT 转任何东西会失去 cue 设定。 align:start position:10% 是 WebVTT 定位一行字的方式,
而 SRT 根本没有「位置」这个概念。NOTE、STYLE、REGION 区块也一样。
SRT 和 WebVTT 互转不会失去任何东西,除了 cue 识别码,而那个东西没有别的格式会读。<i> 与
<b> 在两边写法完全相同。
任何格式转成 ASS 都会把时间四舍五入到百分秒,因为 ASS 的时间戳就只有这个精度。十毫秒在任何 帧率下都不到一格,肉眼看不出来——但它是真的,绕一圈回来不会比特完全相同。
WebVTT 真的需要那个文件头
一个 .vtt 档如果开头不是 WEBVTT 这个字,它就不是 WebVTT 档,浏览器会拒绝它——而且通常是无声
无息地拒绝,<track> 就是什么都不显示。把 .srt 改名成 .vtt 不会有用,原因就在这里。
另一半是那个逗号:SRT 写 00:00:01,000,WebVTT 写 00:00:01.000。这两种错误做出来的文件在
文字编辑器里看起来都很正常,在播放器里什么都不会发生。
相关
要把字幕挂到 HTML <video> 上,见 SRT 转 WebVTT;要让字幕组的文件在
没听过 ASS 的硬件上播得出来,见 ASS 转 SRT。