javascript - 解锁网络音频的最佳解决方案

标签 javascript audio cross-browser web-audio-api

我一直在尝试思考一些关于我可以使用 Web Audio API 通过 JavaScript 来做什么的想法。我知道,根据用户的浏览器,有时如果没有某种用户手势,它不会让您播放音频。我一直在研究如何做到这一点,它们是非常有用的方法,但问题是一些开发人员找到了不同的方法来做到这一点。例如:

  1. 使用 audioContext.resume()audioContext.suspend() 方法通过更改网络音频的状态来解锁网络音频:
function unlockAudioContext(context) {
    if (context.state !== "suspended") return;
    const b = document.body;
    const events = ["touchstart", "touchend", "mousedown", "keydown"];
    events.forEach(e => b.addEventListener(e, unlock, false));
    function unlock() {context.resume().then(clean);}
    function clean() {events.forEach(e => b.removeEventListener(e, unlock));}
}
  • 创建一个空缓冲区并播放它以解锁网络音频。
  • var unlocked = false;
    var context = new (window.AudioContext || window.webkitAudioContext)();
    function init(e) {
        if (unlocked) return;
    
        // create empty buffer and play it
        var buffer = context.createBuffer(1, 1, 22050);
        var source = context.createBufferSource();
        source.buffer = buffer;
        source.connect(context.destination);
    
        /* 
          Phonograph.js use this method to start it
          source.start(context.currentTime);
    
          paulbakaus.com suggest to use this method to start it
          source.noteOn(0);
        */
    
         source.start(context.currentTime) || source.noteOn(0);
    
         setTimeout(function() {
                 if (!unlocked) {
                     if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {
                         unlocked = true;
                         window.removeEventListener("touchend", init, false);
                     }
                 }
         }, 0);
    }
    
    window.addEventListener("touchend", init, false);
    

    我主要知道这两种方法是如何工作的,但是 我的问题是这里发生了什么,有什么区别以及哪种方法更好等等? 有人可以向我解释一下来自 AudioBufferSourceNodesource.playbackState 吗?我以前从未听说过那里的那处特性。它甚至没有文章或在 Mozilla MDN Website 中被提及。 。 另外作为一个奖励问题(您不必回答),如果这两种方法都有用,那么如果您知道我的意思,是否可以将它们组合在一起? 抱歉,如果问得太多了。谢谢:)

    资源:

    https://paulbakaus.com/tutorials/html5/web-audio-on-ios/

    https://github.com/Rich-Harris/phonograph/blob/master/src/init.ts

    https://www.mattmontag.com/web/unlock-web-audio-in-safari-for-ios-and-macos

    最佳答案

    这两种方法都有效,但我发现第一种(通过用户手势恢复上下文)更干净。 AudioBufferSource 方法是一种粗暴的黑客行为,旨在向后兼容通过用户手势开始播放缓冲区的旧网站。如果您不从手势启动缓冲区,则此方法不起作用。 (我认为。)

    您想使用哪一个取决于您。

    关于javascript - 解锁网络音频的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59150956/

    相关文章:

    javascript - 数据 Mb 限制客户端应用程序

    javascript - 奇数之和直到达到Javascript中的限制

    javascript - 带有下拉列表的 Asp.net 动态 gridview

    html - IE8 以奇怪的方式显示网站

    android - 按下按钮后播放声音的延迟太多

    c++ - 如果路径太长,mciSendString 将不会播放音频文件

    javascript - 窗口完全加载后应用背景颜色

    javascript - 是否有任何 QUnit 断言/函数来测试元素是否在数组中

    javascript - AngularJS - 无法显示来自 JSON 的内容

    c# - 可以在 C# 应用程序中执行实时多 channel 音频卷积吗?