【发布时间】:2014-06-21 04:01:34
【问题描述】:
我正在使用 ScriptProcessorNode 的 onaudioprocess 回调来处理麦克风输入。 通过将 MediaStreamSourceNode 连接到 ScriptProcessorNode,我可以在 onaudioprocess 回调函数中获取原始音频数据。 然而,大约 30 秒后(从 10 到 35 秒不等),浏览器停止调用 onaudioprocess。 在以下代码中,console.log 输出('>>')总是在大约 30 秒后停止。
var ctx = new AudioContext();
var BUFFER_LENGTH = 4096;
console.log('Buffer length is + ' + BUFFER_LENGTH);
navigator.webkitGetUserMedia({audio: true}, function (stream) {
var mediaStreamSource = ctx.createMediaStreamSource(stream);
var scriptProcessor = ctx.createScriptProcessor(BUFFER_LENGTH, 1, 1);
scriptProcessor.onaudioprocess = function (e) {
console.log('>>');
};
scriptProcessor.connect(ctx.destination);
}, function(e) {
console.error('Unable to get audio input source.');
});
我尝试了所有可能的 BUFFER_LENGTH(256、512、1024、2048、4096、8192、16384),但情况没有改变(日志在 30 秒后停止。) 我在最新的 Chrome 版本(版本 35.0.1916.153)和 Canary(版本 37.0.2060.3 canary)中观察到了这个问题。 有谁知道任何解决方法?
【问题讨论】:
-
我想知道这是否与您在 onaudioprocess 回调中返回空 e.outputbuffers 的事实有关。在看到空缓冲区 30 秒后,Chrome 可能想要节省电池/处理能力并关闭回调。
-
感谢notthetup,我尝试将inputBuffer复制到onaudioprocess中的outputBuffer。但它并没有解决问题。代码如下: var source = e.inputBuffer.getChannelData(0); var dest = e.outputBuffer.getChannelData(0); dest.set(source);
标签: google-chrome web-audio-api getusermedia