ios - 即使在用户交互之后,iOS Safari 上的 Web 音频 API 也不会播放

标签 ios html audio safari

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

以下是我尝试过的事情:

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

  • 以上都不适用于 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/

    相关文章:

    ios - MPMusicPlayerController 的当前播放队列?

    javascript - 为什么 iPhone iOS 显示 momentjs 的无效日期

    android - Cordova/PhoneGap 的性能影响?

    javascript - 使用打开的下拉菜单滚动内容

    html - CSS 正文 :first-child

    android - 通过音轨在 Android 中播放音乐

    objective-c - 使应用程序适用于 ios 3.0

    ios - 如何解决这个评分?

    audio - FFMPEG amix过滤器音量问题与不同持续时间的输入

    javascript - 更改幻灯片后如何更改音频源?