我知道 iOS Safari 存在一个限制,即在用户触发交互之前不会播放音频。所以我把代码放在了 touchstart
事件。但不幸的是,我几乎尝试了所有组合,但无法在 iOS Safari 上播放。
以下是我尝试过的事情:
touchstart
之外回调 以上都不适用于 iOS Safari,但它们都可以在桌面 Chrome 和 Safari 中播放。这是要点的链接,您可以查看我进行更改的版本(P.S. click 事件用于在桌面上进行测试)
https://gist.github.com/angelathewebdev/32e0fbd817410db5dea1
最佳答案
声音仅在 currentTime 开始运行时播放,但在 currentTime 准确调度声音似乎不起作用。他们需要一点点 future (例如:10ms)。您可以使用以下 createAudioContext 函数等待上下文准备好发出噪音。在 iPhone 上似乎不需要用户操作,但在 iPad 上还没有这样的成功。
function createAudioContext(callback, errback) {
var ac = new webkitAudioContext();
ac.createGainNode(); // .. and discard it. This gets
// the clock running at some point.
var count = 0;
function wait() {
if (ac.currentTime === 0) {
// Not ready yet.
++count;
if (count > 600) {
errback('timeout');
} else {
setTimeout(wait, 100);
}
} else {
// Ready. Pass on the valid audio context.
callback(ac);
}
}
wait();
}
随后,在播放音符时,不要调用 .noteOn(ac.currentTime),而是调用 .noteOn(ac.currentTime + 0.01)。
关于ios - 即使在用户交互之后,iOS Safari 上的 Web 音频 API 也不会播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33260781/