0

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

1 回答 1

3

从返回的值getByteTimeDomainData是 8 位整数,从 0 到 255。128 是一半,基本上意味着“没有信号”。它相当于从 -1 到 1 的 PCM 音频数据中的 0。

但无论如何 - 有几个问题:

首先,您永远不会将输入连接到分析仪。你需要input.connect(analyser)在你打电话之前analyser.getByteTimeDomainData()

第二个问题不在于您的代码,而在于它只是一个实现问题。

基本上,该gotStream函数只被调用一次 - 并且getByteTimeDomainData只返回 1024 个音频样本的数据(几分之一秒)。问题是,这一切都发生得如此之快,而且在创建流之后的如此短的时间内,还没有真正的输入。尝试analyser.getByteTimeDomainData()在 1000 毫秒内包装呼叫和随后的循环,setTimeout然后在您授予浏览器录制权限后立即对着麦克风吹口哨。您应该会看到 128 以外的一些值。

这是一个例子:http: //jsbin.com/avasav/5/edit

于 2013-04-04T04:14:48.587 回答