⭐ 觉得好用?收藏备用,下次直接打开
💬

字幕格式适配上传平台

SRT/ASS/VTT/LRC 互转 + 编码修复 + 时间轴偏移:让字幕在 YouTube/B站/网页/本地播放器都正确显示

📅 发布于

字幕看起来简单(“不就是几行文字加时间戳吗”)——真用起来全是踩坑:格式不对上传被拒、编码错乱码、时间轴对不上、样式上传后被剥。这条 pipeline 把字幕的”格式 + 编码 + 时间”三轴一次性搞定。

核心方法:单工具 字幕格式转换 一次完成——选源格式 + 源编码(多数能自动识别)→ 目标格式 + 目标编码 + 时间偏移(如需要)→ 导出。配套教程 字幕格式全解 + 平台兼容矩阵 详细列了各平台规格。

本地处理:纯文本处理在浏览器跑——字幕字节不上传。即使是含敏感剧情/剧本的字幕也安全。

🛠 工具链(1 步)

  1. 选源格式(SRT/ASS/VTT/LRC)+ 源编码(自动检测 UTF-8 / GBK / Big5)+ 目标格式 + 目标编码(多数平台要 UTF-8 无 BOM)。可同时做整体时间偏移(毫秒级正负)和样式标签清理。

    💡 时间分隔符自动转换(SRT 用逗号 `00:00:01,500`、VTT 和 ASS 用点 `00:00:01.500`);GBK / Big5 自动识别并转 UTF-8(旧字幕常见);样式标签(`{...}` ASS 控制码、HTML 标签)一键清理。详见 [字幕格式全解 + 平台兼容矩阵](/tutorials/subtitle-format-platform-compatibility/)。

👤 适合谁用

  • YouTube 上传字幕 需要 SRT 或 VTT(不接受 ASS 样式)
  • B站投稿字幕 需要 SRT(不接受 ASS)
  • 网页 <video> 嵌入字幕 必须 VTT(HTML5 <track> 规范)
  • 本地播放器精修字幕 要 ASS 才能加字体/颜色/位置/卡拉 OK 效果
  • 字幕乱码 来自老字幕的 GBK / Big5 编码
  • 时间轴对不上 字幕比视频早或晚几秒(剪辑版差异)
  • 歌词文件 LRC 想转成视频字幕 SRT

⚠️ 顺序与踩坑

SRT 转 ASS 样式必然全无

SRT 是纯文本格式——只有时间戳和文字,没有任何样式信息。转 ASS 后所有字幕都套默认样式(白字黑边、Arial、20pt)。要字体/颜色/位置/动画,必须转完后手动在 ASS 编辑 [V4+ Styles] 段落,或用 Aegisub 批量改样式。反向:ASS 转 SRT 一定会丢样式,是预期行为。

VTT 时间分隔符必须用点号

VTT 用 点号 分秒毫秒(00:00:01.500),SRT 用 逗号00:00:01,500),ASS 用点+百分秒(0:00:01.50)。直接把 SRT 文件改后缀 .vtt → 浏览器 <track> 不识别。正确:用 字幕格式转换 真的做格式转换,不要只改扩展名。VTT 文件头必须是 WEBVTT,少了这一行也不识别。

UTF-8 BOM 是 YouTube / Bilibili 杀手

部分编辑器(Notepad / Sublime 旧版)保存 UTF-8 时默认带 BOM(文件头 3 字节 EF BB BF)。YouTube / Bilibili 上传带 BOM 的字幕会乱码或拒收——它们按"严格 UTF-8 无 BOM"解析。解法:用 字幕格式转换 选目标编码 UTF-8(无 BOM),自动剥掉文件头 BOM 字节。VS Code 状态栏可以看到当前编码是 "UTF-8" 还是 "UTF-8 with BOM"。

时间轴偏移修不了"延迟越长越偏"

整体时间偏移修复的是所有字幕统一加减一个固定时间(剪辑版差几秒)。修不了的情况:(1) 字幕和视频帧率不同(24fps 字幕用在 30fps 视频上,越往后越偏)——需要时间拉伸/压缩,不是简单加减;(2) 字幕有手动断点导致后半段错位——需要分段调整。当前工具只支持整体偏移,复杂情况建议用 SubtitleEdit / Aegisub 桌面工具。

ASS 高级样式上传到流媒体一律会被剥

YouTube / Bilibili / Netflix 等流媒体平台对 ASS 样式标签全部剥离——你做了精美的字体、彩色、卡拉 OK 染色,上传后用户看到的是裸 SRT 风格白字。ASS 的合理使用场景只有:(1) 本地播放器(PotPlayer / mpv / IINA)软字幕;(2) 内嵌入视频文件(用 mkvtoolnix 把 ASS 内嵌 MKV);(3) 视频压制到画面(hardsub,用桌面 ffmpeg 烧入)。不要给上传 YouTube 的字幕做 ASS 样式——浪费精力。

📚 相关教程精选

❓ 常见问题

YouTube / Bilibili 上传字幕用哪种格式编码?

SRT 或 VTT,UTF-8 无 BOM 编码。具体:(1) 时间格式 00:00:01,500(SRT)或 00:00:01.500(VTT);(2) 换行 CRLF / LF 都接受;(3) 编码必须 UTF-8 且无 BOM——这是最常见的"上传被拒/乱码"原因。ASS / SSA 不接受——即使强行上传,平台会自动剥样式变 SRT 文本。

字幕乱码怎么修?

99% 是编码问题。常见情形:(1) 文件是 GBK / GB2312 编码(老字幕、中文 Windows 编辑器默认),播放器按 UTF-8 解析 → 乱码;(2) 文件有 UTF-8 BOM(EF BB BF 开头),平台不认 BOM;(3) 文件混用编码(极少见)。修复字幕格式转换 选源编码 GBK → 目标编码 UTF-8(自动识别 90% 案例)。判断当前编码用 HEX ↔ 文本 看文件前 3 字节:EF BB BF = UTF-8 BOM;FF FE = UTF-16 LE;无特殊前缀且能解中文 = UTF-8 无 BOM;不能 = 多半 GBK。

字幕和视频对不上(早 / 晚几秒)怎么修?

整体偏移字幕格式转换 的"时间偏移(毫秒)"输入框——字幕早于视频输入正数(往后推),晚于视频输入负数(往前提)。如:字幕比视频快 2 秒 → 输入 +2000仅整体差适用:(1) 你的视频是带片头的版本,字幕是去片头版本;(2) 视频有广告插入但字幕没有。整体差修不了:字幕越往后偏越大 → 帧率不匹配,需要桌面 SubtitleEdit 做"全局拉伸"。

网页 <video> 嵌入字幕用什么格式?

必须 VTT(HTML5 <track> 元素的规范要求)。用法:<track src="subtitle.vt" kind="subtitles" srclang="zh" label="中文" default>。VTT 文件要求:(1) 首行必须是 WEBVTT;(2) 时间分隔符 .(点号);(3) UTF-8 编码。注意:本地 HTML 文件加载 VTT 字幕会被 CORS 拦截(file:// 协议限制)——必须放到 http(s) 服务器才能正常加载。本地测试用 python -m http.server 起本地服务器。

LRC 歌词文件能用在视频字幕上吗?

可以转 SRT 但效果有限。LRC 是音乐歌词格式,每行只有开始时间没有结束时间(默认显示到下一行开始为止)。字幕格式转换 LRC → SRT 时给每行一个固定显示时长(3–5 秒)或以下一行开始时间为结束。适用场景:把 LRC 歌词配到 MV 当字幕(基本够用);不适用场景:精确字幕(每句长度差异大时显示时间会乱)。