Safari(iOS 15+)强制要求 kind="subtitles" 的 track 标签必须声明 srclang,否则静默禁用字幕渲染;srclang 需为合法 BCP 47 标签(如 zh、en),且须与 default 搭配使用才生效。

是的,Safari(尤其是 iOS 15+)强制要求 kind="subtitles" 的 <track> 必须带 srclang,否则字幕不渲染——哪怕加载成功、控制台无报错。
为什么 Safari 会静默忽略没写 srclang 的字幕
iOS Safari 对 kind="subtitles" 做了严格语义校验:它把 srclang 当作字幕轨道的“语言身份凭证”,而非可选描述。缺失时,Safari 直接跳过该轨道的渲染逻辑,但不会抛错或提示。开发者常误以为“字幕已加载”,实际只是 DOM 存在、readyState 变为 loaded,而 mode 仍为 disabled。
-
srclang不匹配系统语言不会导致失败,但缺失一定失败 - 即使只有一条字幕轨道,也必须显式声明
srclang - Firefox 和旧版 IE 不支持
srclang,但 Safari(含 iPad)从 iOS 10 起就要求它
srclang 值写错的常见表现
值不是合法 BCP 47 语言标签(如 zh-CN、en、ja),Safari 会当作无效并静默禁用轨道。注意:
- 不能写
zh-chs或Chinese—— 必须用zh或zh-Hans - 大小写不敏感,但建议全小写(
zh比ZH更稳妥) - 空格、下划线、中文字符都会让 Safari 判定为非法值
- 错误示例:
srclang="Chinese (Simplified)"→ 静默失效;正确写法:srclang="zh-Hans"
和 default 属性的配合关系
srclang 单独存在还不够——若没加 default,Safari 通常也不会自动启用字幕(尤其在 iPad 上)。两者是“绑定生效”组合:
-
srclang是“准入门槛”,决定轨道是否被 Safari 认作有效字幕 -
default是“启动开关”,决定该有效轨道是否默认显示 - 缺一不可。常见写法:
<track kind="subtitles" src="a.vtt" srclang="zh" label="中文" default> - 不要依赖 JS 动态设置
srclang:Safari 只在 DOM 解析阶段读取该属性,动态赋值无效
最易被忽略的是:你以为字幕“能加载”就等于“能同步”,其实 Safari 在 srclang 缺失时连时间轴对齐逻辑都不会触发——后续所有时间戳修复、换行处理、PTS 校准都白做。

















