音频不播放的主因是浏览器静默拒绝,需优先检查network面板中音频请求的content-type是否匹配后缀(如.mp3→audio/mpeg),并确认的type属性为标准mime类型(如audio/mpeg而非audio/mp3)。

音频在 HTML 中“不播”“没声”“报错但没提示”,90% 不是代码写错了,而是浏览器静默拒绝——它连错误都不抛,只默默卡住。排查必须从 Network 面板和响应头开始,而不是先改 JS。
查 Network 面板里 audio 请求的 Content-Type
这是第一道关卡。即使 src 路径完全正确,只要服务器返回的响应头里 Content-Type 是 text/plain、application/octet-stream 或为空,浏览器就当它不是音频,直接跳过解码流程。
- Apache 用户:在
.htaccess或虚拟主机配置中加AddType audio/mpeg .mp3和AddType audio/ogg .ogg - Nginx 用户:在
types块里补audio/mpeg mp3;和audio/ogg ogg; - 本地开发别双击 HTML:用
python3 -m http.server 8000启服务,否则 Chrome/Firefox 在file://下会屏蔽音频加载 - 在 DevTools 的 Network 标签页里点开音频请求,看 Headers → Response Headers →
Content-Type是否匹配后缀(.mp3→audio/mpeg)
检查 <source></source> 的 type 属性是否写错
type="audio/mp3" 是常见错误写法,浏览器不认识,直接忽略该 <source></source>。它只认标准 MIME 类型,且大小写敏感。
- MP3 文件必须配
type="audio/mpeg",不是audio/mp3或audio/x-mp3 - OGG 文件必须配
type="audio/ogg",且确认编码是 Vorbis(用ffprobe a.ogg看输出含Audio: vorbis) - WAV 尽量少用:Chrome 对 IEEE Float 编码的 WAV 直接拒绝,Firefox 虽支持但体积大、加载慢
- 顺序很重要:
<source></source>从上到下匹配,把兼容性最强的(如 MP3)放最前
识别 MEDIA_ERR_SRC_NOT_SUPPORTED(code: 4)
控制台没报错,但音频就是不动?打开 error 事件监听,或检查 audio.error?.code。值为 4 意味着浏览器已成功加载文件,但解码器不支持该编码——不是路径问题,是格式被判死刑。
- 别信文件后缀:用
ffprobe your-audio.mp3查真实编码,重点看Audio: mp3 (mp3), 44100 Hz, stereo, fltp中的fltp(浮点),Safari 很可能拒播 - 最稳 fallback 组合只有两个:
<source src="a.mp3" type="audio/mpeg"></source>+<source src="a.ogg" type="audio/ogg"></source> - 删掉所有
autoplay和muted先测试:确保能手动点控件播出来,再谈自动逻辑 - 如果用了 Web Audio API(比如
AudioContext),首次play()失败常因上下文被挂起,必须由用户手势唤醒
确认播放触发是否满足用户手势条件
iOS Safari、Chrome、微信内置浏览器都要求:首次有声 play() 必须发生在用户点击、触摸或键盘事件回调内。写在 DOMContentLoaded、window.onload 或定时器里,100% 失败,Promise 被 reject,控制台显示 The play() request was interrupted。
- 可靠写法:
button.addEventListener('click', () => audio.play().catch(e => {}), { once: true }) - iOS 更苛刻:元素不能
display: none、不能opacity: 0、必须在视口内,否则即使点过也静音 - 微信 iOS 还要等
WeixinJSBridgeReady事件,否则play()直接返回空 Promise - 静音自动播(
muted autoplay)虽被允许,但前提是volume === 0且未被后续 JS 改写
真正难排查的不是“播不了”,而是“播了但无声”“加载了但不触发 canplay”——这些往往卡在 MIME 类型、type 值拼写、或用户手势链断裂上。Network 面板和 audio.error?.code 是唯二可信的线索,其余全是干扰项。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











