必须位于内且在所有之后,src需同源或配置CORS,VTT文件须为text/vtt类型、UTF-8无BOM编码、严格遵循WEBVTT语法。
浏览器只在 元素内部识别 ,且顺序很重要:必须出现在所有 标签之后、 之前。如果放错位置(比如在 前面或 video 外),字幕不会加载,控制台也不会报错,只是静默失效。
常见错误写法:
这种顺序下,Chrome 和 Firefox 都会忽略该 track。正确顺序示例:
的 src 是一个独立 HTTP 请求,受跨域限制。如果视频在 https://example.com,而字幕文件放在 https://cdn.example.com/zh.vtt,浏览器会因缺少 CORS 响应头拒绝加载,控制台显示类似 Failed to load resource: No 'Access-Control-Allow-Origin' header 的错误。
.vtt 加载都会失败(浏览器禁用 file 协议下的跨域请求,即使同目录)——必须起本地服务(如 python3 -m http.server)Content-Type: text/vtt,Nginx/Apache 要显式配置 MIME 类型,否则部分浏览器(如 Safari)可能解析失败zh.vtt 和 ZH.VTT 在 Linux 服务器上是两个不同资源kind 是必填属性,合法值为 "subtitles"、"captions"、"descriptions"、"chapters"、"metadata"。注意:
kind="subtitle"(少 s)是无效值,浏览器当 kind="metadata" 处理,字幕不会出现在字幕菜单里kind="subtitles" 表示翻译性字幕(含对话+音效说明),适合外语观众;kind="captions" 表示面向听障用户的完整音轨描述(含说话人、音乐、环境声),播放器 UI 通常分开显示这两类default 属性即可,但同一 kind 下只能有一个 default;多个 default 时,仅第一个生效.vtt 不是自由文本,必须以 WEBVTT 开头(顶格、无空格、无 BOM),且时间戳格式严格:。常见失效原因:
00:00:01.234 --> 00:00:04.567
WEBVTT,浏览器解析失败.12 或 .1234) 可以,但 不支持),或用了 CSS 类名(class="highlight")——WebVTT 不支持自定义 class
最小可用 VTT 示例:
WEBVTT
00:00:01.000 --> 00:00:03.000
你好,欢迎观看。
00:00:04.000 --> 00:00:06.000
这是第一句字幕。
字幕功能看着简单,但 track 的加载时机、MIME 类型、VTT 语法容错率都极低,任意一环出问题都是“无声无息不显示”。调试时优先检查 Network 面板里 .vtt 请求是否 200、响应头是否有 Content-Type: text/vtt、响应体开头是否真为 WEBVTT。