user2039789
user2039789

Reputation: 97

put live audio input data into array

Hey I am using GetUserMedia() to capture audio input from user's microphone. Meanwhile I want to put captured values into an array so I can manipulate with them. I am using the following code but the problem is that my array gets filled with value 128 all the time (I print the results in console for now), and I can't find my mistake. Can someone help me find my mistake?

//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);
};

Upvotes: 0

Views: 1191

Answers (1)

Kevin Ennis
Kevin Ennis

Reputation: 14466

The values returned from getByteTimeDomainData are 8 bit integers, from 0 to 255. 128, which is half way, basically means "no signal". It is the equivalent of 0 in PCM audio data from -1 to 1.

But ANYWAY - there are a couple problems:

First, you're never connecting the input to the analyser. You need input.connect(analyser) before you call analyser.getByteTimeDomainData().

The second problem isn't with your code so much as it's just an implementation issue.

Basically, the gotStream function only gets called once - and getByteTimeDomainData only returns data for 1024 samples worth of audio (a tiny fraction of a second). The problem is, this all happens so quickly and for such a short period of time after the stream gets created, that there's no real input yet. Try wrapping the analyser.getByteTimeDomainData() call and the loop that follows it in a 1000ms setTimeout and then whistle into your microphone as soon as you give the browser permission to record. You should see some values other than 128.

Here's an example: http://jsbin.com/avasav/5/edit

Upvotes: 3

Related Questions