2013-04-03 2 views
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); 
}; 

ответ

2

Значения, возвращаемые из getByteTimeDomainData 8 разрядные целые числа от 0 до 255. 128, который на полпути, в основном означает «нет сигнала». Это эквивалентно 0 в PCM аудиоданных от -1 до 1.

Но все равно - есть пара проблем:

Во-первых, вы никогда подключения входа в анализатор. Вам нужно input.connect(analyser), прежде чем позвонить analyser.getByteTimeDomainData().

Вторая проблема связана не с вашим кодом так, как с проблемой внедрения.

В принципе, функция gotStream вызывается только один раз - и getByteTimeDomainData возвращает данные только для 1024 пробных значений аудио (небольшая часть секунды). Проблема в том, что все это происходит так быстро и за такой короткий период времени после создания потока, что пока нет реального ввода. Попробуйте обернуть вызов analyser.getByteTimeDomainData() и цикл, который следует за ним в 1000 мс setTimeout, а затем свистнуть в микрофон, как только вы дадите разрешение браузера на запись. Вы должны увидеть некоторые другие, чем 128.

Вот пример значения: http://jsbin.com/avasav/5/edit

+0

Эй спасибо за ваш ответ. Да, действительно, я забыл подключить вход с анализатором :(Проблема в том, что когда я использую ваш код, есть время, когда массив перестает заполняться. Как я могу заставить его собирать мои значения все время? – user2039789

+0

Вам нужно JavaScriptNode. Посмотрите на это: http://jsbin.com/avasav/7/edit –

 Смежные вопросы

  • Нет связанных вопросов^_^