Javascript 防止多个音频上下文
我按照一种模式使用Webaudio将声音附加到对象。它工作得很好,但是如果我在一个页面上生成多个项目并附加此脚本,我会得到一个console.log,表明我已经超过了每页可用的AudioContext的最大数量 我的理解是,该行声明了Javascript 防止多个音频上下文,javascript,html,web-audio-api,Javascript,Html,Web Audio Api,我按照一种模式使用Webaudio将声音附加到对象。它工作得很好,但是如果我在一个页面上生成多个项目并附加此脚本,我会得到一个console.log,表明我已经超过了每页可用的AudioContext的最大数量 我的理解是,该行声明了audioContext附加到窗口的audioContext,而不是声明新的audioContext。如何询问窗口是否已经有AudioContext,并简单地将音频节点添加到其图形中 var that = this , audioContext = window
audioContext
附加到窗口的audioContext,而不是声明新的audioContext。如何询问窗口是否已经有AudioContext,并简单地将音频节点添加到其图形中
var that = this
, audioContext = window.AudioContext || window.webkitAudioContext;
if (!audioContext) {
console.warn("Web Audio API not supported in this browser.");
return;
}
this.context = new audioContext();
我不能完全肯定我理解你的问题。为什么不能在脚本顶部创建一个音频上下文,然后让代码的其余部分引用它 为了提供答案,您可以这样做:
var getContext = function() {
var ac = null;
if ( !window.AudioContext && !window.webkitAudioContext ) {
console.warn('Web Audio API not supported in this browser');
} else {
ac = new ( window.AudioContext || window.webkitAudioContext )();
}
return function() {
return ac;
};
}();
然后,每次需要上下文时,只需调用以下函数:
var ctx = getContext(),
osc = ctx.createOscillator();
osc.connect(ctx.destination);
我想你得自己检查一下。这些电话你打了好几次了吗?这是一个模块吗?您可以尝试将上下文设置为全局上下文。它位于一个模块中,并且该脚本连接到许多对象。对于少于4个实例,这是可以的,但超过4个实例,它会丢弃语音并记录消息。全球环境将是完美的。“我该怎么做呢?”凯文·恩尼斯回答道。否则,只需将创建音频上下文的代码移到模块外,而不是使用
this.context
,只需使用context
。这非常有效。但是我不完全明白为什么。你能给我指出一些关键词或概念来解释为什么这样做吗?基本思想是它使用闭包。从本质上说,外部函数立即执行(注意末尾的括号??调用它的括号),并为您创建音频上下文。它还返回一个只返回音频上下文的新函数。因此,您基本上是说“getContext
等于调用此外部函数的结果”。因为外部函数的返回值是另一个函数,这就是你得到的。一开始,闭包可能有点让人难以理解(它们是为我准备的)——但谷歌搜索一下应该会让你走上正轨。