将实时音频输入数据放入数组中

时间:2013-04-03 22:00:23

标签: arrays microphone web-audio getusermedia

嘿我正在使用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);
};

1 个答案:

答案 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