Web Audio API 演示在 iOS 上不起作用

All*_*Liu 0 javascript iphone ios web-audio-api

我目前正在为我正在处理的项目调整此网络音频 API 演示,但在 iPhone 上测试时没有声音。它在 iPad 上运行良好。

我已经搜索了解决方案,并在 StackOverflow 上找到了此线程,其中包含以下答案片段:

iOS 6 上的 Safari 有效地从 Web Audio API 静音开始。直到您尝试在用户输入事件中播放声音(创建缓冲区源,将其连接到目标,然后调用 noteOn()),它才会取消静音。在此之后,它会取消静音并且音频播放不受限制并且应该如此。这是 Web Audio API 如何在 iOS 6 上工作的一个未记录的方面(Apple 的文档在这里,希望他们尽快更新它并提及这一点!)

用户输入事件应该是播放按钮上的 onclick 事件,但更改为使用noteOn()而不是start()仍然无法修复它。

更新:我也尝试将播放按钮与touchend事件绑定,但无济于事。

这是使用 noteOn() 的函数:

function playNote(buffer, pan, x, y, z, sendGain, mainGain, playbackRate, noteTime) {
    // Create the note
    var voice = context.createBufferSource();
    voice.buffer = buffer;
    voice.playbackRate.value = playbackRate;

    // Optionally, connect to a panner
    var finalNode;
    if (pan) {
        var panner = context.createPanner();
        panner.panningModel = "HRTF";
        panner.setPosition(x, y, z);
        voice.connect(panner);
        finalNode = panner;
    } else {
        finalNode = voice;
    }

    // Connect to dry mix
    var dryGainNode = context.createGain();
    dryGainNode.gain.value = mainGain * effectDryMix;
    finalNode.connect(dryGainNode);
    dryGainNode.connect(masterGainNode);

    // Connect to wet mix
    var wetGainNode = context.createGain();
    wetGainNode.gain.value = sendGain;
    finalNode.connect(wetGainNode);
    wetGainNode.connect(convolver);

    if (iOS) {        
        voice.noteOn(noteTime);    
    }
    else {
        voice.start(noteTime);
    }
}
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激。谢谢。

All*_*Liu 7

我真的觉得很傻。显然,如果您的 iPhone 处于振动模式,则不会播放声音。

  • 这个答案让我节省了数小时毫无结果的调试时间。谢谢! (2认同)
  • 经过数小时毫无结果的调试后,我找到了这个答案。谢谢! (2认同)