字幕时间轴校准 解决的是整体偏移解决不了的那一类不同步:字幕开头对得上、越往后差得越多。这种情况下时间轴需要的不是平移,而是按比例拉伸。全程浏览器本地处理,文件不上传。
| 现象 | 原因 | 用哪个模式 |
|---|---|---|
| 整轨一致地早了/晚了几秒 | 片源版本不同、有无片头 | 只整体偏移 |
| 开头对得上,越往后差越多 | 帧率不符、变速压制 | 两点校准 或 帧率换算 |
| 前半段对、后半段突然错开一大截 | 片源中间被剪过 | 本工具解决不了,得分段处理 |
最后一种要说明白:线性校准假设整轨是同一个倍率和偏移。如果视频中间插了广告或删过一段,那是分段问题,得把字幕切成几段分别校——这类情况建议用 Aegisub 手工处理。
把时间轴看成一次函数:
新时间 = 原时间 × 倍率 + 偏移
你给两个锚点(某条字幕「在文件里写的时间」和它「实际该出现的时间」),就是两个方程两个未知数,倍率和偏移直接解出来,两个锚点都会精确命中。所以锚点间隔越大越准——两点定一条直线,两点挨得越近,线的斜率越容易被读数误差带偏。
时间可以写成 1:23.5、01:23:45.678、01:23:45,678 或纯秒数 83.5,四种都认。
| 换算 | 倍率 | 每小时漂移 | 两小时电影到片尾 |
|---|---|---|---|
| 25 → 23.976 | 1.0427 | 字幕晚 2 分 34 秒 | 晚 5 分多 |
| 23.976 → 25 | 0.9590 | 字幕早 2 分 28 秒 | 早近 5 分 |
| 25 → 24 | 1.0417 | 字幕晚 2 分 30 秒 | 晚 5 分 |
| 24 → 23.976 | 1.0010 | 字幕晚 3.6 秒 | 晚 7 秒多 |
| 30 → 29.97 | 1.0010 | 字幕晚 3.6 秒 | 晚 7 秒多 |
23.976 / 29.97 / 59.94 这几个 NTSC 帧率实际是 24000/1001 这样的分数,小数只是近似写法——这也是「差一点点」会累积成大问题的根源。
因为你遇到的不是平移,是拉伸。判断方法很简单:把开头对齐之后再跳到片尾看——如果片尾还是差、而且比开头差得更多,那就是帧率问题。整体偏移是给每条字幕加同一个数,开头对了结尾必然还差;这个工具做的是「时间 × 倍率 + 偏移」,开头和结尾能同时对上。
锚点 ① 挑靠前的一句真实台词,别挑片头 Logo 或字幕组署名——那些常常是后补的,时间本身就不准。锚点 ② 越靠后越好,默认就是最后一条。两个锚点间隔越大,算出来的倍率越准:间隔 1 分钟时你填的时间差 0.2 秒,会在两小时的片子上放大成二十多秒;间隔拉到 1 小时以上,同样的误差只剩零点几秒。间隔不足 1 秒时工具会直接拒绝计算,不给你一个看着像模像样的假结果。
字幕原用帧率 = 这份字幕当初是照着哪个版本的片源做的;视频实际帧率 = 你现在手上这个视频文件的帧率。后者在播放器里能看到(MPV 按 i、PotPlayer 按 Tab、VLC 在「工具 → 媒体信息 → 编解码器」)。前者通常不写在文件里,靠猜:字幕来自欧洲 / 国内论坛的旧资源多是 25(PAL),来自北美蓝光的多是 23.976(NTSC)。猜错了就换一个试,预览表会立刻告诉你末条被移到哪儿。实在不确定就用两点校准,它不需要知道帧率。
值得。倍率是 1.001,听着微不足道,但它是累积的:每小时漂移 3.6 秒,一部两小时的电影到片尾就差了 7 秒多——那已经是「一句话说完了字幕才出来」的程度。同理 29.97 ↔ 30 也是 3.6 秒每小时。真正夸张的是 25 ↔ 23.976,每小时两分半。
用下面的微调。它是在算出来的结果之上再整体平移,正值延后、负值提前,粒度 0.1 秒。常见情况是倍率已经对了(快慢一致了),只是整轨还早或晚一点——那说明你填锚点时读的时间有个固定的小误差,微调推一下即可,不用重新填锚点。
只改时间戳,别的一律不动。文本内容、换行、ASS 的 {\xxx} 样式标签和表头、LRC 的 meta 全部原样保留,输出格式也和输入保持一致(拖进来是 .ass 出去还是 .ass)。要顺便换格式或清样式标签,用 字幕格式转换。
不上传。读文件用浏览器的 FileReader,编码识别用原生 TextDecoder,解析、拉伸、序列化全在浏览器内存里完成,没有任何网络请求。关掉网络这个页面照样能用。