嘿我正在使用GetUserMedia()来捕获用户麦克风的音频输入。同时我想将捕获的值放入数组中,以便我可以使用它们进行操作。我使用下面的代码,但问题是我的数组一直填充值128(我现在在控制台打印结果),我找不到我的错误。有人能帮助我找到我的错误吗?
//create a new context for audio input
context = new webkitAudioContext();
var analyser = null;
var dataarray = [];
getLiveInput = function() {
navigator.webkitGetUserMedia({audio: true},onStream,onStreamError);
};
function onStream(stream)
{
var input = context.createMediaStreamSource(stream);
analyser = context.createAnalyser();
var str = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteTimeDomainData(str);
for (var i = 0; i < str.length; i++) {
var value = str[i];
dataarray.push(value);
console.log(dataarray)
}//end for loop
}//end function
function onStreamError(e) {
console.error('Streaming failed: ', e);
};
答案 0 :(得分:2)
从getByteTimeDomainData
返回的值是8位整数,从0到255. 128,这是一半,基本上意味着“无信号”。它在PCM音频数据中相当于0,从-1到1.
但无论如何 - 有几个问题:
首先,您永远不会将输入连接到分析仪。在致电input.connect(analyser)
之前,您需要analyser.getByteTimeDomainData()
。
第二个问题不在于你的代码,而在于它只是一个实现问题。
基本上,gotStream
函数只被调用一次 - 而getByteTimeDomainData
只返回1024个样本音频(一小部分时间)的数据。问题是,这一切都发生在这么快和这么短的时间在流创建之后,还没有真正的输入。尝试将analyser.getByteTimeDomainData()
调用及其后面的循环包裹在1000毫秒setTimeout
中,然后在您授予浏览器录制权限后立即将其传入您的麦克风。你应该看到128以外的一些值。
以下是一个示例:http://jsbin.com/avasav/5/edit