字幕处理是视频用户的高频痛点——下载的字幕打开是乱码、找的字幕和视频不同步、转完格式样式全没了——三类问题占了字幕用户 90% 的求助。
本工具专攻这三件事:字符编码自动识别 + 整体时间偏移 + 4 种格式两两互转——全程浏览器本地,不上传。这篇按”乱码、时间、样式”三段拆开各自的修复原理。
痛点 1:乱码与编码自动识别
“乱码”几乎都是编码识别错了。常见对应:
| 看到的乱码 | 实际编码 | 误用编码 |
|---|---|---|
| 锟斤拷、鎴戠埍浣 | GBK 中文 | UTF-8 |
| 蝙穚 | Big5 中文 | UTF-8 |
| 縺ゅ縺ゅ繧 | Shift_JIS 日文 | UTF-8 |
| 鞏堧鞎堧 | EUC-KR 韩文 | UTF-8 |
| ?????? | 大概率 UTF-16 被当单字节 | UTF-8 |
| 字之间夹空字符 | UTF-16 LE/BE | 单字节解码 |
本工具的识别策略
1. 看 BOM
EF BB BF → UTF-8 (BOM)
FF FE → UTF-16 LE
FE FF → UTF-16 BE
2. 无 BOM 时严格校验 UTF-8
通过 → UTF-8 (严格)
失败 → 进入启发式
3. 启发式判断(统计高字节分布)
高字节落在 GBK 范围占比高 → GBK
高字节落在 Big5 范围占比高 → Big5
高字节落在 Shift_JIS 半角假名 → Shift_JIS
...
4. 全部失败 → 默认 GBK + 标注"低置信度"
最稳的解码顺序:BOM > UTF-8 严格 > 启发式。
识别失败时的手动切换顺序
按”先地区匹配再特殊”的顺序试:
- 中文字幕:GBK → Big5 → UTF-16 LE
- 日文字幕:Shift_JIS → EUC-JP → UTF-16
- 韩文字幕:EUC-KR → UTF-16
多数情况一次切换就能见正确字符——立刻在预览区能看到。
为什么自动识别还会偶尔出错
短文件(< 200 字符)启发式数据量不够,GBK / Big5 高字节分布相似时判错。字幕一般几 KB 起,但 LRC 单句歌词的极短文件可能踩到——直接手动切。
痛点 2:时间偏移与重新打轴
字幕同步问题分 4 类,3 类本工具能修,1 类要专业工具:
| 同步问题类型 | 症状 | 修复 |
|---|---|---|
| 均匀平移 | 开头到结尾一致差 N 秒 | 本工具时间偏移 ± N |
| fps 缩放 | 越往后偏移越大 | Subtitle Edit / Aegisub 按比例缩放 |
| 分段错位 | 中间插过广告 / 删过片段 | 分段各自偏移(手动多次) |
| 完全错位 | 时间完全乱,只剩文本对 | 重新打轴(专业工具) |
均匀平移的修复
最常见——字幕和视频版本不同导致整体平移:
视频 0:30 → "你好"
字幕 0:30 → ""
字幕 0:31 → "你好" ← 慢 1 秒
输入偏移 -1.0 → 字幕全行 -1 秒
字幕 0:30 → "你好" ✓
如何判断偏移多少:
- 找视频里一句听得清开始的台词
- 在字幕里找到这一句的时间戳
- 用视频时间 - 字幕时间 = 偏移量
- 字幕比视频晚 → 偏移负数;字幕比视频早 → 偏移正数
精度建议:试 0.5 秒一档,对不准再 0.1 秒一档。
fps 缩放的判断
视频常见帧率:23.976 / 24 / 25 / 29.97 / 30 / 59.94 / 60 fps。
字幕版本不匹配时长比例:
24 fps 视频 + 25 fps 字幕:
1 小时电影末尾偏移 = 3600 × (1/24 - 1/25) = 6 秒
症状:开头偏 0 秒、中间偏 3 秒、结尾偏 6 秒。
本工具不修这个——需要按时间倍率缩放时间轴:
新时间 = 旧时间 × (源 fps / 目标 fps)
要做的话用 Subtitle Edit 的”Change frame rate”功能。
分段错位的修复
视频中间有片头片尾切换、广告插入、删减——字幕只是部分段落错位:
- 看找出两个稳定参照点:偏移开始的句子 X、偏移恢复的句子 Y
- 把字幕分成 3 段:X 之前、X 到 Y 之间、Y 之后
- 中间段单独偏移
本工具一次只做整体偏移——需要分两次:
- 第一次:先整体偏移让前段正确
- 第二次:把后段提取出来再各自偏移
实务建议:分段错位场景里 70% 由”片源不同”引起——直接换字幕版本更快。
痛点 3:格式互转与样式处理
4 种格式的能力矩阵
| 能力 | SRT | WebVTT | LRC | ASS |
|---|---|---|---|---|
| 时间轴 | ✓ | ✓ | ✓ 单时间 | ✓ |
| 多行文本 | ✓ | ✓ | ✗ | ✓ |
| 内联粗体斜体 | △(HTML 标签,兼容性差) | ✓ <b> <i> | ✗ | ✓ |
| 颜色字体大小 | ✗ | △(CSS class) | ✗ | ✓ |
| 描边阴影 | ✗ | ✗ | ✗ | ✓ |
| 定位 / 运动 | ✗ | ✗ | ✗ | ✓ |
| 字体嵌入 | ✗ | ✗ | ✗ | ✓ |
| 播放器兼容性 | 100% | 较广 | 歌词 App | 字幕组生态 |
转换时的样式损耗
ASS → SRT:
{\b1\c&HFF&}加粗红字{\b0\c}
↓ 清理样式
加粗红字 (样式全丢,只剩文本)
SRT → ASS:
<i>斜体</i>
↓ 转换
{\i1}斜体{\i0} (SRT 内联标签转 ASS 标签)
WebVTT → SRT:
<c.red>红字</c>
↓ 清理样式
红字 (CSS class 丢失)
LRC → SRT:
[00:30.50]你好
↓ 估算结束时间
00:00:30,500 --> 00:00:33,400
你好
样式清理的精确逻辑
勾选”清理样式”按钮时本工具丢弃的标签:
- ASS 大括号标签:
{\b1}{\c&HFF0000&}{\fs20}{\pos(100,200)}等 - HTML 内联:
<i><b><u><font color="..."><br> - WebVTT 时间戳:
<00:00:30.000>(中段时间戳,不影响主时间轴)
保留:
- 主时间轴
- 文本内容
- 换行(多行字幕保持多行)
输出编码的选择
| 编码 | 适用场景 |
|---|---|
| UTF-8(无 BOM)默认 | 99% 场景,所有现代播放器支持 |
| UTF-8 BOM | 老 PotPlayer / Windows 记事本兼容 |
| GBK | 中文老软件、老旧 Windows 播放器 |
经验:保留 UTF-8 无 BOM 是最广兼容的选择——不要 BOM、不要 GBK、不要 UTF-16。
5 种典型坏样本
1. 下载站字幕全是问号
打开是 ??????????——通常是 UTF-16 被当单字节解码。本工具识别 BOM 后自动正确解码。
2. 部分字符乱
如”我?爱?你”——单字节字符混进了多字节字符串。字幕作者用错编辑器另存了,本工具识别启发式可能误判——手动切到 GBK 重试。
3. 时间戳格式错
00:00:30,500 SRT 用逗号
00:00:30.500 WebVTT / ASS 用点
部分播放器对错格式不容错,本工具按目标格式自动改。
4. ASS 转 SRT 后字幕长行不换行
ASS 用 \N 换行,本工具转 SRT 时正确转成 \n——但如果原 ASS 用 \n 软换行,转后会变成空格。这是 ASS 标准里两种换行的语义差异,本工具按 ASS 规范处理。
5. LRC 转 SRT 后空行多
LRC 文件里的元数据行 [ti:歌名] [ar:歌手] [al:专辑] 会被本工具识别为元数据而非歌词行——不会转成 SRT 字幕。如果你的 LRC 把元数据写在 [00:00.00] 时间戳后面(非标准),可能会作为歌词转出来。
默认不做的事
- 不修复 fps 缩放型不同步——只做整体偏移,按比例缩放要专门工具
- 不重打轴——只读时间不算时间
- 不识别语音对齐字幕和视频——需要语音识别 + 强制对齐,是另一个工程
- 不内嵌字幕到视频——只处理字幕文件,烧录字幕要用 ffmpeg / 视频压制工具
转完字幕去做视频压制要嵌字幕,用 ffmpeg + LibASS;想从视频里提取已有字幕轨,用 ffmpeg -c:s copy 抽取;要听语音生成字幕(无字幕从零做),用 Whisper / OpenAI API 等语音识别服务。subtitle-convert 专攻”已有字幕的格式 / 编码 / 时间”三件事——这三件事修对了,95% 的字幕痛点就消失了。