MP3是兼容性最好的音频格式,但需满足MPEG-1 Layer III编码、采样率≤48kHz等条件;Safari和部分Android WebView不支持HE-AAC、VBR混合码率等扩展,须用ffprobe验证codec_name=mp3且sample_rate=44100或48000,并配对正确MIME类型audio/mpeg。

MP3 是当前兼容性最好的音频格式,但必须配对正确编码和容器
不是所有 .mp3 文件都能播——Safari 和部分 Android WebView 仅支持 MPEG-1 Layer III 编码、采样率 ≤48 kHz 的 MP3;HE-AAC、VBR 混合码率、MP3 Surround 等都会导致静音或 MEDIA_ERR_DECODE 错误。
验证方式很简单:Audio.canPlayType('audio/mpeg') 返回 "probably" 才算高置信度可用。别只看后缀,用 ffprobe 检查实际编码:
ffprobe -v quiet -show_entries stream=codec_name,codec_type,sample_rate -of default audio.mp3
- ✅ 推荐:codec_name=mp3, codec_type=audio, sample_rate=44100 或 48000
- ❌ 拒绝:codec_name=mp3float、aac、he-aac、mp3adu
服务端也得配对 MIME:audio/mpeg,不能返回 application/octet-stream 或 audio/x-mpeg。
OGG 不是“一种格式”,Opus 和 Vorbis 兼容性天差地别
写 是无效的——浏览器无法判断内部是 Vorbis 还是 Opus。Safari 17.5 仍不支持 audio/ogg,哪怕你放第一个,它直接跳过。
真正该用的是明确声明编解码器的写法:
-
:Chrome/Firefox 支持好,体积比 MP3 小 30%~50%,适合网络受限场景 -
:Firefox/Chrome 可播,但 Safari 完全无视,不能作主源
注意:Audio.canPlayType('audio/ogg; codecs="opus"') 在 Chrome 中返回 "probably",在 Safari 中返回空字符串 "",这是正常行为,不是 bug。
WAV 和 M4A 都有强限制,不能靠后缀蒙混过关
.wav 不等于“随便播”。Safari(尤其 iOS)只认 16-bit PCM little-endian(CD 格式),μ-law、a-law、IEEE 754 浮点 WAV 全部失败。文件大、加载慢,仅建议用于 ≤1 秒的提示音。
.m4a 更容易踩坑:必须含 AAC-LC 编码,HE-AAC v2、AAC-HE、ALAC(除非明确声明 codecs="alac")均不被 Safari 识别。且 type 必须写成:
-
✅(注意是audio/mp4,不是audio/m4a) -
❌(Safari 中大概率返回"")
服务端若返回 Content-Type: audio/x-m4a,Chrome 会忽略该源,不尝试加载。
多格式 fallback 顺序错了,等于白写
浏览器按 DOM 顺序逐个尝试,匹配即停。顺序错,fallback 就失效:
- ❌ 错误:WAV 放第一位 → Firefox 用户被迫下载几 MB 才开始播
- ❌ 错误:OGG 放最后 → Safari 直接跳过,不往下试,最终触发“不支持”提示
- ✅ 推荐顺序(兼顾兼容性、体积、首帧速度):
这个顺序不是“谁新谁上”,而是让 Chrome/Firefox 优先用更小更快的 Opus,Safari 回退到稳定但体积大的 MP3,最后用 WAV 做兜底——不是为了“覆盖所有浏览器”,而是防止因路径错误、MIME 错配导致所有源都被跳过,连 fallback 提示都出不来。
最容易被忽略的一点:所有 source 的 type 属性必须精确,服务端响应头必须匹配,且 CORS 和 Range 支持缺一不可。前端写对了,后端没配好,照样静音、卡 loading、进度条不可拖动。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











