字幕不显示或延迟出现,90%是位置、属性、文件或服务端配置未对齐所致;其必须置于开始标签后、所有闭合后,且kind、srclang、label、src四属性缺一不可,VTT文件需严格符合格式与响应头要求。

字幕不显示或延迟出现,90% 是 <track></track> 位置、属性、文件或服务端配置中某一项没对上——它不会报错,只会静默失效。
为什么 <track></track> 写了却没反应
浏览器只在 <video></video> 开始标签后、所有 <source></source> 闭合后这个极窄区间内解析 <track></track>。放错位置等于没写:
-
<track></track>写在<source></source>前面 → 被忽略 -
<track></track>包在<div> 里或放在 <code>外 → 不发起请求,video.textTracks.length恒为 0 - 多个
<track></track>之间插了 HTML 注释或空行 → Safari 可能中断后续解析 - 用 JS 动态
appendChild插入 → 失效(<video></video>已加载完成,不会再重新扫描) -
kind="subtitles":必须写全,不能省略、不能写成caption或subtitles(末尾空格也不行) -
srclang:必须是合法 BCP 47 码,如zh-Hans、en-US、ja;chinese、cn全部无效 -
label:用户实际看到的菜单名,建议含变体说明,如label="中文(简体)";为空时显示(no label),多语言场景下无法区分 -
src:路径需可访问;若跨域,服务端必须返回Access-Control-Allow-Origin: *,否则 Firefox/Edge 静默失败 - 首行不是顶格、全大写、无空格、无 BOM 的
WEBVTT→ 整个文件被丢弃 - 时间戳写成
00:00:01.23 --> 00:00:04.567(毫秒位不足三位)→ 解析失败 - 文件保存为 UTF-8 with BOM(Windows 记事本默认)→ 中文变方块或解析中断
- 服务端未配置 MIME 类型,返回
text/plain或application/octet-stream→ Chrome 直接忽略,不报错 - 本地开发用
file://协议双击打开 → 所有src请求被浏览器拦截,必须起本地服务(如python3 -m http.server) -
hls.js、dash.js等播放器完全接管媒体加载逻辑,<video></video>只是渲染容器 - 原生
<track></track>不会解析m3u8/mpd中的字幕轨道 - 真正可用的方案是:由播放器实例暴露字幕轨道 API(如
hls.subtitleTracks),再手动注入 DOM 或调用addTextTrack()
kind、srclang、label、src 四个属性缺一不可
浏览器不做任何容错推断,漏任一属性,该轨道就不会出现在右键字幕菜单中:
VTT 文件和服务端响应必须严格合规
错一位就全盘失效:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
立即学习“前端免费学习笔记(深入)”;
HLS/DASH 场景下 <track></track> 基本不起作用
<track src="xxx.vtt"></track> 在 HLS 或 DASH 场景下只是“挂了个空壳”:
最容易被忽略的是服务端响应头和本地开发协议——VTT 文件能用编辑器打开不等于浏览器能加载,curl -I 看一眼 Content-Type 和 Access-Control-Allow-Origin 往往比反复改 HTML 更快定位问题。


















