字幕时间轴调整
SRT、WebVTT、ASS 三种字幕整体平移或按倍速缩放,导出前逐条对照新旧时间。先缩放还是先平移由你定。
本工具只改时间轴,不转换格式:识别成什么格式,就按什么格式导出,避免顺带丢掉样式。
平移
接受 +1.5s、-0.25s、+1000ms、+00:00:01,500 或裸数字(按秒算)等写法。正数是往后推,字幕出现得更晚。
缩放
缩放默认关闭,只做平移,这样贴进来的字幕不会被静默拉伸。要纠正帧率再勾上「启用倍速缩放」:框里预填的 1.0427 就是 25 / 23.976,用来把按 25fps 做的时间轴拉长到 23.976fps;倍速大于 1 整体拉长(字幕整体更晚),小于 1 整体压缩。
运算顺序
两种顺序不等价:先缩放是「原时间 × 倍速 + 偏移」,先平移是「(原时间 + 偏移)× 倍速」,后者会把偏移量也放大 1.0427 倍。只有在启用缩放时这一项才起作用;默认先缩放再平移,因为最常见的组合是「帧率先校正,再补一个固定的片头差」。
结果
填入字幕并设置好偏移量或倍速,这里会逐条列出新旧时间并给出统计。
使用说明
三种格式的时间码写法不一样,改之前先认清自己手上那一份:SRT 用逗号分隔毫秒,写成 00:00:01,500;WebVTT 用点号,写成 00:00:01.500,规范还要求时间轴原点必须是 00:00:00.000,所以平移出负数在 VTT 里是明确的非法值;ASS 用的是 H:MM:SS.cc,小时只有一位、小数是百分秒,0:00:01.50 就是 1.5 秒。本工具按识别到的格式原样导出,不顺手改变格式。
什么时候用平移、什么时候用缩放,可以用一条简单的判据:随便挑最后一条字幕,看它比画面早多少,再挑中间一条看差多少。如果两个差值几乎一样,是整段固有的偏移,用平移;如果后面的偏差明显更大,是按帧率做的时间轴放到了别的帧率上,用缩放。25fps 的时间轴放到 23.976fps 的视频上会整体变慢,画面里的动作比字幕慢,所以字幕要按 25 / 23.976 ≈ 1.0427 同比例拉长;反过来用 23.976 / 25 ≈ 0.9590。这两个数字是界面上的快捷按钮,直接算出来的,不是猜的。
缩放和平移不满足交换律,先做哪个结果不同。先缩放再平移是 新时间 = 原时间 × 倍速 + 偏移,先平移再缩放是 新时间 = (原时间 + 偏移)× 倍速,两者的差正好是偏移量乘以(倍速 − 1)。所以偏移填 5 秒、倍速填 1.0427 时,两种顺序会差出约 0.21 秒,看片尾能看出来。界面默认先缩放再平移,但顺序是可选项,请按自己的实际情况选。
导出前会算两组数:一组是平移后起点或终点小于 0 的条目数,这类条目在不同播放器里表现不一致,有的当 0 显示、有的整条丢掉;另一组是变换后「下一段开始早于上一段结束」的条目数,也就是相邻字幕重叠。缩放和平移都是单调变换,不会自己制造重叠,所以同时给出源文件原本的重叠处数——两个数字一样就说明是原字幕本来就重叠,不是本次改动造成的。
ASS 的输出只改 Dialogue 行的起止时间,[Script Info]、[V4+ Styles] 等段落整段保留。时间字段的位置是从 [Events] 段的 Format 行读出来的,不写死「第 2、3 个逗号」,因为有些导出工具会调整字段顺序;切分时按字段总数切开,最后一个 Text 字段整段留下,所以对白正文里自带的逗号不会被截断。另外 ASS 的时间码只到百分秒,毫秒会被四舍五入到 10 毫秒一档,这是 ASS 本身精度决定的,不是本工具丢的。
整个过程在浏览器本机完成,字幕内容不会发到任何服务器,断网也能用。调整完建议用播放器实际放一遍,重点核对第一条和最后一条。需要改格式(比如从 ASS 转 SRT)用字幕格式转换;如果视频本身裁过片头,先用音频剪切把音轨裁到与画面起点一致,再回来统一平移会省事很多;要按画面位置核对时间点,可以先用视频截图取帧导出一帧看看。
常见问题
字幕总是越到后面越早,该平移还是缩放?
开头对得上、后面偏得越来越多,是倍速对不齐,属于帧率问题,要用缩放;整段从头到尾都差同一个固定的量,才是平移。判断方法:挑最后一条字幕记下差了多久,再挑中间一条,如果两处差的时间不一样,就不是平移能解决的。
1.0427 这个倍速是怎么来的?
来自 25 / 23.976,等于 1.042709…,取四位小数是 1.0427。场景是把按 25fps 做的时间轴放到 23.976fps 的视频上,画面被拉长,字幕就必须同比例拉长才对得上。反过来 23.976 的字幕配 25fps 视频,倍速要填 23.976 / 25,也就是 0.9590。
先缩放和先平移,结果会差多少?
会差一整个偏移量乘以倍速的差。先缩放是「原时间 × 倍速 + 偏移」,先平移是「(原时间 + 偏移)× 倍速」,后者等于把偏移也一起放大了 1.0427 倍。偏移很小的时候看不出,偏移到几秒时两条路线会差出几百毫秒,所以这里把顺序做成了显式选项,不替你决定。
为什么校验要专门数负时间的条目?
因为播放器对负时间的处理不一致:有的把它当 0 从头显示,有的整条丢掉,还有的会让字幕卡在屏幕上不走。这里按「起点或终点小于 0」计数,出现数字就说明偏移量减多了,把偏移调小一档即可。
「相邻字幕重叠」算出来不为 0,是工具算错了吗?
不一定。缩放和平移都是单调变换,不会凭空制造或消除重叠,所以这里同时给出「源文件原本的重叠处数」和「变换后的重叠处数」。两个数字一样,说明是原字幕本来就重叠,跟本次调整无关;只有变换后比原本多,才说明有问题。
转成 ASS 之后时间为什么是 XX 毫秒的整数倍?
ASS 的时间码只精确到百分秒,也就是 10 毫秒一档,任何毫秒都会被四舍五入到这个刻度上,例如 1.234 秒会写成 0:00:01.23。SRT 和 WebVTT 都是毫秒精度,所以 ASS 这一步是唯一的精度损失,反复导出会累积这零点几毫秒的误差。
ASS 的样式表和脚本信息会被改掉吗?
不会。ASS 输出只改 Dialogue 行的起止时间字段,[Script Info]、[V4+ Styles]、[Fonts] 等段落整段照抄。时间字段的位置不是写死第 2、3 个逗号,而是先读 [Events] 段的 Format 行,按里面的 Start、End 字段位置来改,正文里自带的逗号也完整保留。