我知道iOS Safari中存在一个限制,在用户触发交互之前音频不会播放。所以我已将代码放在touchstart
事件中。但不幸的是,我几乎尝试了所有组合,但我无法在iOS Safari上播放它。
以下是我尝试过的事情:
touchstart
回调以上都不适用于iOS Safari,但它们都可以在桌面Chrome和Safari中播放。这是gist的链接,你可以看到我做出更改的版本(P.S. click事件用于在桌面上进行测试)
https://gist.github.com/angelathewebdev/32e0fbd817410db5dea1
答案 0 :(得分:0)
只有在currentTime开始运行时才会播放声音,但是在currentTime上完成调度声音似乎不起作用。他们需要进入未来(例如: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)。