【发布时间】: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