iOS Safari上的Web Audio API即使在用户交互后也无法播放

时间:2015-10-21 13:34:22

标签: ios html5 audio safari

我知道iOS Safari中存在一个限制,在用户触发交互之前音频不会播放。所以我已将代码放在touchstart事件中。但不幸的是,我几乎尝试了所有组合,但我无法在iOS Safari上播放它。

以下是我尝试过的事情:

  • 将音频负载置于touchstart回调
  • 之外
  • 尝试添加增益节点
  • 使用0.01作为开始时间

以上都不适用于iOS Safari,但它们都可以在桌面Chrome和Safari中播放。这是gist的链接,你可以看到我做出更改的版本(P.S. click事件用于在桌面上进行测试)

https://gist.github.com/angelathewebdev/32e0fbd817410db5dea1

1 个答案:

答案 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)。