Web Audio onaudioprocess适用于Firefox,JSFiddle in Chrome,但不适用于Chrome本身

时间:2014-12-05 21:00:37

标签: javascript google-chrome jsfiddle web-audio

我在WebAudio / WebMIDI应用上使用Chrome 39.0.2171.71(64位)。我安装了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/ (对于这个例子,我必须在getUserMedia中添加function(){console.log(&#39; error&#39;);}的第三个参数(使它运行。当我启动它时,这给了我一个未被引用的未定义的引用错误,但它然后运行并且onaudioprocess回调可靠地工作。)

我试过的事情

我已经详尽地搜索过了,似乎有一些与chromeScriptProcessor有关的Chrome范围问题。我已经尝试了将我的流程范围扩展到全局的所有内容(在顶部声明它,声明没有&#39; var&#39;,设置myscriptnode.onaudioprocess = window.audioProcess = function(event))并且没有任何效果。一切都在Firefox中有效。

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

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

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