canPlayType()返回"probably"、"maybe"或"",非空不等于可播放;需结合实际加载验证,且Safari对.ogg恒返"",顺序错误或服务端MIME不匹配将导致静音或失败。

直接看浏览器是否能播,播不了就不是代码写错了,而是格式本身不被支持——audio 标签不会报错,但 canPlayType() 返回空字符串或 "",就是典型的音频格式兼容漏洞前兆。
检查 canPlayType() 的返回值是否可信
这个函数不是布尔判断,它返回的是字符串:"probably"、"maybe" 或 ""(空字符串)。很多开发者误以为返回非空就等于“一定能播”,其实 "maybe" 在 Safari 上对 .ogg 就是常事,但实际播放会静音或失败。
- 必须对每个格式调用
audio.canPlayType("audio/ogg")、audio.canPlayType("audio/mp3")等,不能只靠文件后缀猜 - Chrome 和 Firefox 对
ogg返回"probably"时基本可靠;Safari 对ogg永远返回"",别信它的canPlayType - IE11 已淘汰,但若需兼容旧内核,
wav在 IE9+ 中根本不可用,canPlayType("audio/wav")必然返回""
用 source 元素做多格式 fallback,但顺序很关键
audio 标签里多个 source 不是“并行尝试”,而是按书写顺序依次加载,一旦某个 src 加载成功(哪怕只是 HTTP 200 响应头),就不会再试下一个。如果第一个是 .ogg,而用户用的是 Safari,就会卡住不动。
- 把最广泛支持的格式放在最前面:优先
mp3,其次wav(仅限 Chrome/Firefox/Safari),最后才是ogg(仅作开源备用) - 不要写成:
<source src="a.ogg"><source src="a.mp3">—— Safari 会停在第一个,然后静音 - 推荐写法:
<source src="a.mp3" type="audio/mpeg"><source src="a.wav" type="audio/wav">,省略ogg更稳妥
监听 error 和 emptied 事件比依赖 loadedmetadata 更早发现问题
loadedmetadata 触发只说明元数据读取成功,不代表音频能解码播放;真正崩溃往往发生在 play() 调用后几毫秒内,此时只有 error 事件能捕获。
立即学习“前端免费学习笔记(深入)”;
- 必须绑定
audio.addEventListener("error", () => { console.warn("audio load failed"); }) - 某些安卓 WebView 在格式不支持时不会触发
error,但会触发emptied(媒体资源重置),可作为兜底判断 - 不要只监听
canplay:它可能在解码失败后仍触发(比如音频流头损坏但浏览器没立刻发现)
最容易被忽略的是服务端 MIME 类型配置——即使你写了 type="audio/mpeg",如果 Nginx/Apache 没配 audio/mpeg 对应 .mp3,部分浏览器(尤其是旧版 Android)会拒绝加载,且不报任何 JS 错误。查 network 面板看响应头 Content-Type 是否匹配,比反复改前端更有效。



















