【问题标题】:Web Audio onaudioprocess works in Firefox, JSFiddle in Chrome, but not Chrome ItselfWeb Audio onaudioprocess 适用于 Firefox,JSFiddle 适用于 Chrome,但不适用于 Chrome 本身
【发布时间】:2014-12-05 21:00:36
【问题描述】:

我正在使用 Chrome 39.0.2171.71(64 位)的 WebAudio/WebMIDI 应用程序。我已经安装了 jazz-soft webmidi 插件。

我根本无法启动 onaudioprocess。我已经把事情精简到最基本的代码:

<!DOCTYPE html>
<html lang="en">
    <head></head>
    <body>
        Page Loaded.
        <script>
             var context;
             if (window.AudioContext) {
                 context = new AudioContext(); 
             } else {
                 context = new webkitAudioContext(); 
             }
             console.log('Javascript is working.');

             oscillator = context.createOscillator();
             oscillator.start(0);

             myscriptnode = context.createScriptProcessor(4096, 1, 1);
             myscriptnode.onaudioprocess = function(event) {
                  console.log('ONAUDIOPROCESS works!');
             };

             oscillator.connect(myscriptnode);
         </script>
     </body>
</html>

这适用于 Firefox。事实上,我一直在玩的大部分东西都在 Firefox 中有效,但在 Chrome 中却没有。但是,以下两个示例适用于我在 Chrome 中运行的 JSFiddle:

http://jsfiddle.net/78yKV/3/(此示例运行,但 onaudioprocess 回调似乎很慢/不稳定,有时会中断,需要重新启动。)

http://jsfiddle.net/99rxd/(对于这个例子,我必须将 function(){console.log('error');} 的第三个参数添加到 getUserMedia() 以使其运行。这个当我启动它时给我一个未捕获的 r undefined 引用错误,但它随后运行并且 onaudioprocess 回调可靠地工作。)

我尝试过的事情

我进行了详尽的搜索,似乎 createScriptProcessor 存在一些 Chrome 范围问题。我已经尝试了一切来将我的进程范围设置为全局(在顶部声明它,声明没有'var',设置 myscriptnode.onaudioprocess = window.audioProcess = function(event))并且没有任何效果。在 Firefox 中一切正常。

我抱有希望的唯一原因是因为 JSFiddle 示例的工作。似乎代码在 JSFiddle 中而不是在浏览器中工作的主要原因与等待 DOM 加载有关。我怀疑这是问题所在,但我尝试将我的 javascript 放入 (function(/code/)();,将 oninit() 函数添加到 body 标记并将我的代码放入函数 init( ){} 等,没有运气。

我不知道发生了什么。如果它在 JSFiddle 中工作,我不应该让它在浏览器中工作吗?有没有另一种方法来改变范围,所以我的事件处理程序不会被垃圾收集(这是我假设的问题)......还是有一些更基本的问题?我还没有看到使用浏览器中的 onaudioprocess 工作的一个回调,这让我觉得它可能比范围/垃圾收集问题更基本。会不会是 jazz-soft 插件?

感谢您的帮助!

【问题讨论】:

    标签: javascript google-chrome jsfiddle web-audio-api


    【解决方案1】:

    Chrome 仍然存在脚本处理器需要连接到目标的错误。

    添加“myscriptnode.connect(context.destination);”到最后,我想你会发现它按预期工作。

    【讨论】:

    • 这完全解决了我的问题。当它们弹出时,是否有集中检查此类错误的地方?我对网络开发非常非常陌生。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 2014-11-17
    • 2015-06-09
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多