piapia123
zh

SRT ↔ WebVTT 字幕转换

音视频

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把 SRT 与 WebVTT 互相转换,顺带调整时间轴。格式转换这一半没什么可说的,真正省事的是另外几件: 整体平移修音画不同步 —— 片源与字幕来自不同压片组时常常差上半秒到两秒,逐条改是不现实的。填负数就是整体提前。 按比例缩放修帧率错配 —— 这是最容易被误当成「平移」的一件事。23.976 fps 的片子配了按 25 fps 做的字幕,偏差越到后面越大:开头对得上,十来分钟后可能差好几秒,而中间某个点是对的。这种必须乘一个系数(25 ÷ 23.976 ≈ 1.0427),平移是修不好的。两者同时存在时顺序也重要,这里是先缩放、再平移。 ⚠️ 平移过量会明确报错,而不是给你一份坏文件。 整轨提前 5 秒时,开头那几条会变成负数时间。把它们钳到 0 会让那几条挤在一起、原样写出去则是 `-00:00:01,000` 这种非法时间戳 —— 播放器对两种情况的反应都是沉默:不报错、不提示,只是那几条再也看不见了。所以这里直接拒绝,并告诉你涉及几条。 两处细节也按规范处理了:SRT 的编号会被重编(它只是位置信息,输入里可能是乱的),而 WebVTT 输出不带编号(那个位置是 cue 标识符而不是序号,写成 `1` `2` 会让人误以为是一回事)。

功能

  • SRT ↔ WebVTT 双向转换,格式自动判断
  • 整体平移时间轴(秒,可为负)—— 修音画不同步
  • 按比例缩放时间轴 —— 修帧率错配,这类偏差越到后面越大,平移修不好
  • 两者叠加时先缩放、再平移(顺序反了会把偏移也放大一遍)
  • ⚠️ 平移过量会导致负时间时明确报错,并说明涉及几条,不给一份坏文件
  • SRT 的编号按顺序重编 —— 它只是位置信息,输入里的可能是乱的
  • WebVTT 输出不带编号,但保留原有的 cue 标识符与时间轴设置
  • 认 WebVTT 省略小时位的写法(`00:01.000` 是 1 秒而不是 1 小时)
  • CRLF、BOM、NOTE / STYLE 注释块都处理
  • 文件不上传、不经过任何服务器

使用方法

  1. 把 SRT 或 WebVTT 贴进输入框 —— 格式会自动判断
  2. 选输出格式
  3. 音画不同步就填平移秒数;帧率错配就填缩放系数
  4. 结果实时出现,复制或下载即可

常见问题

字幕整体对不上,该用平移还是缩放?
看偏差的规律。从头到尾差同样多 → 用平移,填一个固定的秒数(字幕比画面早出现就是负数,晚出现就是正数)。开头对得上、越到后面越偏 → 用缩放,这是帧率错配:按 23.976 fps 做的字幕配到 25 fps 的片源上要乘 25 ÷ 23.976 ≈ 1.0427,反过来则乘 23.976 ÷ 25 ≈ 0.959。⚠️ 两者常常同时存在(换过片源又换过字幕组),那就两个都填 —— 顺序是先缩放、再平移,反过来的话缩放会把刚加上的偏移又放大一次。
为什么平移太多会报错,别的工具都是直接截断?
因为截断是静默地弄坏文件。整轨提前 5 秒时,开头那几条的时间会变成负数:钳到 0 会让它们挤在同一时刻一起显示,原样写出去则是 `-00:00:01,000` 这种非法时间戳 —— 播放器对两种情况都不会报错,只是那几条再也看不见了。你会以为字幕「就是这样」,而实际上它被工具改坏了。所以这里拒绝执行并告诉你有几条越界:你可以把平移量调小,或者先删掉开头那几条确实不需要的字幕。
SRT 的编号会变吗?
会,输出时一律按顺序重编成 1、2、3……。原因是 SRT 的编号不携带任何信息,只表示「这是第几条」—— 输入文件里的编号可能是乱的、缺号的(复制粘贴、手工编辑之后很常见),而少数播放器只认前面几条,编号乱了就直接不显示。WebVTT 那边则不写编号:那个位置是 cue 标识符(可以是任意字符串),写成 `1` `2` `3` 虽然合法,却容易让人以为它和 SRT 的编号是一回事。原有标识符会保留。
支持 ASS / SSA 吗?
不支持。ASS / SSA 不只是「带时间轴的文本」,它带完整的样式系统(字体、描边、定位、卡拉 OK 效果、图层),而 SRT 与 WebVTT 里没有可以承载这些的结构 —— 单向转换必然会丢掉大部分效果。一份丢了样式的字幕看起来「转换成功」了,实际在播放器里位置、字体全不对,而用户要等看片时才发现。所以这里只做 SRT 与 WebVTT 这两个可以无损互转的格式。

相关工具