浏览器只加载第一个能解码的<source>,而非最优;iOS Safari强制要求首个<source>必须是H.264 Baseline+ACC-LC编码的MP4,type须精确为"video/mp4; codecs="avc1.42E01E, mp4a.40.2"",否则静音、禁自动播放或抛NotAllowedError。

浏览器只认第一个能解码成功的 <source>,不是挑“最好”的,而是挑“第一个能用的”;写错顺序、漏 type、或首个 src 实际编码不匹配,都会导致静默失败——播放器卡住、Network 面板只看到一个请求、控制台却无报错。
为什么第一个 <source> 必须是 H.264 MP4
iOS Safari(含所有 WebKit WebView)强制要求首个可播放的 <source> 是 H.264 Baseline Profile + AAC-LC 编码的 MP4,否则可能静音、禁自动播放,甚至抛 NotAllowedError。哪怕后面跟了完全合法的 VP9 WebM,它根本不会发请求。
- 必须写成
type="video/mp4; codecs="avc1.42E01E, mp4a.40.2"",不能只写type="video/mp4" - 用
ffprobe video.mp4确认实际编码:若输出codec_name=av1,就不能配avc1.xxx - 导出时加 FFmpeg 参数:
-profile:v baseline -level 3.0 -c:a aac -b:a 128k - 本地测试务必用 HTTP(S) 服务,
file://协议下type会被忽略
type 属性写错等于没写
浏览器不看文件后缀,只比对 type 值和响应头 Content-Type。差一个字符(比如 audio/mp3 vs audio/mpeg),Safari 就可能跳过该源。
- MP3 对应
type="audio/mpeg",不是audio/mp3 - WebM 含 VP9+Opus:推荐先试
type="video/webm"(不带codecs),比硬写codecs="vp9, opus"更可靠 - AV1 MP4 必须写
type="video/mp4; codecs="av01.0.05M.08"",但 Safari 会直接忽略——只放最后作锦上添花 - 用
curl -I https://xxx.mp4检查响应头是否真为Content-Type: video/mp4
结构错误会导致整个 <video> 空白
<source> 不是独立标签,脱离 <video> 或 <audio> 就会触发 DOMException: The element has no supported sources,播放器区域直接空白,控制台也不提示具体哪条出错。
立即学习“前端免费学习笔记(深入)”;
- 必须是
<video>的**直接子元素**,且不能和<video src="...">共存——两者互斥 - 所有
<source>后、</video>前,必须有一段降级文字,如Your browser does not support the video tag. - 路径错误(404、大小写不符、跨域)不会报错,只会静默跳过;逐个在新标签页打开
src链接验证可访问性 - 别用 JS 动态插入
<source>——可能绕过浏览器原生格式探测逻辑
最常被忽略的点:第一个 <source> 的 type 和实际文件编码必须严丝合缝,差一个字母或空格,iOS Safari 就拒绝解码,且不告诉你为什么。



















