问题背景
在iPhone(iOS系统)上,尤其是通过Safari浏览器访问网页时,默认情况下一次只能播放一个音频。当你尝试同时播放多个声音(例如背景音乐和音效),后一个音频会中断前一个。这是由于iOS对网页音频播放策略的限制所致。
为什么iPhone限制多音轨播放?
- iOS出于性能与用户体验考虑,限制了网页中并发音频播放数量。
- Safari默认采用“单音频通道”策略,新音频播放会暂停当前正在播放的音频。
- 此限制主要影响通过 HTML5
<audio>标签直接播放的音频。
解决方案
- 使用 Web Audio API:这是最推荐的方法。Web Audio API 允许在iOS上混合多个音频源,并不受单通道限制。
// 示例:加载并播放多个音频 const ctx = new (window.AudioContext || window.webkitAudioContext)(); fetch('sound1.mp3') .then(res => res.arrayBuffer()) .then(buf => ctx.decodeAudioData(buf)) .then(audioBuf => { const source = ctx.createBufferSource(); source.buffer = audioBuf; source.connect(ctx.destination); source.start(); }); - 用户手势触发初始化:iOS要求音频上下文必须由用户交互(如点击)启动。可在页面加载后监听一次点击,初始化 AudioContext。
document.addEventListener('touchstart', () => { if (!window.audioContext) { window.audioContext = new (window.AudioContext || window.webkitAudioContext)(); } }, { once: true }); - 避免使用多个 <audio> 标签并发播放:若必须使用,可尝试将多个音频合并为一个文件,或通过 JavaScript 控制顺序/叠加播放。
注意事项
- iOS 15+ 对 Web Audio 支持更好,但仍需用户手势激活。
- 部分旧版 iOS(如 iOS 12 以下)可能存在兼容性问题。
- 测试时建议使用真机,模拟器行为可能不一致。