必须将H.264 MP4(type="video/mp4; codecs="avc1.42E01E, mp4a.40.2"")置于首个,iOS Safari强制要求首源为H.264 Baseline Profile+ACC-LC,否则静音、禁自动播放甚至抛NotAllowedError;type属性须含精确codecs参数,且不得自带src属性。

标签不是“加多个格式就能自动选最优”,而是按顺序尝试、找到第一个能解码的就停——写错顺序或 type 值,浏览器可能加载失败却毫无提示。
必须把 H.264 MP4 放在第一个
iOS Safari(包括所有 WebKit WebView)会强制拒绝播放非 H.264 编码的首个 :静音、禁止自动播放,甚至抛 NotAllowedError。哪怕你后面写了 perfectly valid VP9 WebM,它根本不会请求。
- 首项必须是
type="video/mp4; codecs="avc1.42E01E, mp4a.40.2""(H.264 Baseline + AAC-LC) - 用 FFmpeg 导出时加
-profile:v baseline -level 3.0 -c:a aac -b:a 128k确保兼容性 - 别信文件后缀:一个
video.mp4可能是 AV1 编码,type="video/mp4"会静默失败
type 属性必须带精确 codecs 参数
只写 type="video/mp4" 等于没写——浏览器无法提前过滤,可能触发无效请求,且 DevTools Network 面板里看不到失败原因。
- MP4 H.264 + AAC:
type="video/mp4; codecs="avc1.42E01E, mp4a.40.2"" - WebM VP9 + Opus:
type="video/webm; codecs="vp9, opus""(Safari 16.4+ 支持) - AV1 MP4:
type="video/mp4; codecs="av01.0.05M.08""(Chrome/Firefox 支持,Safari 忽略) - 绝对不要省略
codecs,也别写成video/mpeg或漏掉video/前缀
不能和 的 src 属性共存
一旦 自身带了 src,浏览器会直接加载那个资源,完全忽略所有 ——这不是 bug,是规范行为。
- 要么用
单源(无回退) - 要么用
多源(必须清空的src) - 动态 JS 插入
也可能绕过原生探测逻辑,优先用静态 HTML
验证是否真生效:看 Network 面板,不是看文件后缀
只看到一个视频请求?说明第一个 被接受了——但接受 ≠ 播放成功。它可能返回 200,却因编码 profile 不对被静默丢弃。
- 打开 DevTools → Network → 找视频请求 → 看响应头
Content-Type是否严格匹配你写的type - 用
ffprobe video.mp4查实际编码:codec_name=av1就不能配avc1.xxx - 在 iOS Safari 上测试时,务必用真机或 Simulator,Desktop Safari 的行为不具代表性
最常被忽略的点:第一个 的 type 和实际文件编码必须严丝合缝,差一个字符,iOS 就卡 loading;而浏览器不会报错,只会沉默。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











