必须紧接后、在前,且kind、srclang、label、src四属性缺一不可;vtt文件须utf-8无bom、首行webvtt、时间戳规范、双换行;流媒体需js手动注入。

track 必须是 video 的直接子元素且紧贴 source 之后
浏览器只在 <video></video> 开始标签内部、所有 <source></source> 闭合之后的位置解析 <track></track>。放错位置等于没写,而且控制台几乎不报错。
常见错误包括:
-
<track></track>写在<source></source>前面 -
<track></track>放在外或包在<div> 里 <li>多个 <code><track></track>之间插入 HTML 注释或空行(部分浏览器会中断解析) -
kind="subtitles":必须显式写全,不能是"subtitle"或空值;其他合法值如"captions"(含音效描述)、"descriptions"(视障音频描述)行为不同,不参与语言切换菜单 -
srclang:当kind是subtitles或captions时为强制项,值必须是 BCP 47 标准语言码(如zh-CN、en-US),不能写成"chinese"或"cn" -
label:用户在播放器 UI 中看到的名称(如"中文(简体)"),为空时可能显示(no label),多语言场景下无法区分 -
src:指向 .vtt 文件的路径,需确保 HTTP 状态码为 200,服务器返回 MIME 类型为text/vtt(Nginx/Apache 需显式配置) - 首行必须是顶格、全大写、无空格、无 BOM 的
WEBVTT(写成webvtt或WebVTT都失败) - 时间戳必须为
hh:mm:ss.mmm --> hh:mm:ss.mmm(小时/分钟/秒各两位,毫秒三位,中间两个空格) - 文件编码必须为 UTF-8 无 BOM(Windows 记事本默认带 BOM,务必用 VS Code 或 Notepad++ 保存为 “UTF-8 without BOM”)
-
WEBVTT后必须紧跟一个空行(\n\n),不能是空格或制表符 - 主流播放器(如
hls.js、dash.js)接管了媒体加载逻辑,<video></video>只是渲染容器 - 流内字幕(如 HLS 的
EXT-X-MEDIA:TYPE=SUBTITLES)必须由 JS 解析后手动注入video.textTracks - 动态添加轨道必须在
video已存在且播放器实例 ready 后执行,否则addTextTrack()返回的TextTrack可能无法被识别 - 切换语言时,旧轨道必须先设
mode = "disabled",再对新轨道设"showing";多个同时"showing"会导致渲染错乱
验证方法:打开开发者工具,在 Console 输入 document.querySelector('video').textTracks.length,若返回 0,说明未被识别。
kind、srclang、label、src 四个属性缺一不可
这四个属性不是“可选增强”,而是浏览器识别轨道并渲染字幕菜单的硬性条件。漏掉任意一个,<track></track> 就不会出现在右键菜单或控件栏中。
VTT 文件格式必须严格合规,错一位就静默失败
WebVTT 解析器容错率几乎为零。哪怕只是少一个换行、毫秒位多一位、首行带 BOM,Chrome/Firefox 就会把该轨道设为 mode = "disabled",且控制台不报错。
流媒体(HLS/DASH)不能依赖 HTML track 标签自动加载字幕
<track></track> 标签仅适用于 MP4/WebM 等普通视频文件,对 HLS、DASH 等流媒体协议不生效。浏览器原生 <track></track> 不解析 m3u8 或 mpd 中的字幕轨道,也不会自动挂载 TS 分片里的 WEBVTT 载荷。











