canPlayType() 是检测浏览器视频格式支持最直接轻量的方法,返回 "probably"、"maybe" 或空字符串,需结合 loadedmetadata、canplay、error 事件及 fallback 才可靠。
canPlayType() 判断浏览器是否支持某视频格式HTML5 的 元素提供 canPlayType() 方法,是检测格式支持最直接、最轻量的方式。它不加载资源,只查 MIME 类型注册表和解码器能力。
注意:返回值只有三种
:"probably"、"maybe"、""(空字符串),没有布尔值。空字符串 = 明确不支持;"maybe" 不代表能播,只是“无法确定”,实际播放时仍可能失败。
video.canPlayType("video/mp4; codecs='avc1.42E01E, mp4a.40.2'") —— 检查 H.264 + AAC 组合(最兼容)video.canPlayType("video/webm; codecs='vp9, opus'") —— 检查 VP9 + Opus(Chrome/Firefox 支持好,Safari 旧版不支持)video.canPlayType("video/ogg; codecs='theora, vorbis'") —— 已基本淘汰,仅作兼容参考canPlayType() 返回 "maybe" 却播不了?因为该方法只检查容器和编码器声明是否被识别,不验证硬件解码能力、DRM 状态、或是否启用了对应功能(如 Safari 对 HEVC 的限制)。尤其在移动端或企业环境,即使返回 "probably",也可能因缺少硬件加速或策略拦截而卡在 stalled 或 error 状态。
真正可靠的判断必须结合事件监听:
立即学习“前端免费学习笔记(深入)”;
loadedmetadata:说明元数据已解析,时长、尺寸可用canplay:说明至少一帧可渲染,但未必流畅error 事件,捕获 video.error.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
不要只靠 canPlayType() 决定 src,而应按优先级顺序尝试多个 ,让浏览器自己选择。这是 HTML5 规范推荐做法,也规避了 JS 判断的局限性。
关键点:
必须带 type 属性,否则浏览器可能跳过检测src 后再调 load(),这会打断原生 fallback 流程iOS Safari 对自动播放、后台音频、HEVC 解码等有强策略控制。即使 canPlayType() 返回 "probably",也可能:
autoplay 失效)hvc1)格式返回 "",除非设备为 iPhone 8+ 且系统 ≥ iOS 11,且用户未关闭“高效编码”设置canplay 触发但画面黑屏真实项目中,建议对 iOS 用户默认降级到 H.264,并用 navigator.userAgent 粗略识别后加额外兜底逻辑,比如监听 timeupdate 是否推进,超时则提示“格式不兼容”。