我正在构建一个简单的应用程序,试图在其中获取缓冲区,但似乎以下代码中的onaudio进程未触发:(PasteBin)
<script>
var audio_context;
var recorder;
window.onload = function init() {
try {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
window.URL = window.URL || window.webkitURL;
audio_context = new AudioContext;
} catch (e) {
console.log(e);
}
navigator.getUserMedia({audio: true}, startUserMedia);
function startUserMedia(stream) {
console.log('Initializing');
var input = audio_context.createMediaStreamSource(stream);
input.connect(audio_context.destination);
var node = input.context.createGain(4096, 2, 2);
node.onaudioprocess = function(e){
console.log('done');
}
node.connect(audio_context.destination);
}
};
</script>
如果代码可以正常工作,我应该获取
Initiliazing \n done
,问题是我仅收到Initiazing且未触发onaudioprocess。我正在使用最新的Chrome: 最佳答案
onaudioprocess
不是GainNode
的属性,而是ScriptProcessorNode
的属性。参见API reference here。
我对Web Audio API并没有真正的经验,但是如果我理解正确,则需要在获取节点和目标之间插入它,以便能够处理这些事件:
var node = input.context.createGain(4096, 2, 2);
var processor = input.context.createScriptProcessor(4096,1,1);
processor.onaudioprocess = function(e){
console.log('done');
}
node.connect(processor);
processor.connect(audio_context.destination);
Example at jsFiddle。如您所见,它在处理流时将
done
打印到控制台,但是我不能说这个设置的正确性(因为我说过,经验不足),因此请仔细检查节点之间的连接-如有必要调整第一个参数(缓冲区大小)。注意:我假设您想做些使改变流的事情(您的问题尚不清楚)。如果您想进行其他操作(例如,仅对其进行分析)但不更改输入,则可以像以前一样连接节点(
node
和destination
),并使用一个输入创建ScriptProcessorNode
,但是没有输出:var node = input.context.createGain(4096, 2, 2);
node.connect(audio_context.destination);
var processor = input.context.createScriptProcessor(4096,1,0);
processor.onaudioprocess = function(e){
console.log('done');
}
node.connect(processor);