2013-04-03 62 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

但無論如何 - 有幾個問題:

首先,你輸入從未連接到分析儀。在致電analyser.getByteTimeDomainData()之前,您需要input.connect(analyser)

第二個問題不在於你的代碼,因爲它只是一個實現問題。

基本上,gotStream函數只被調用一次 - 而getByteTimeDomainData只返回1024個樣本值的音頻數據(很小的一秒)。問題是,在流創建之後,所有這些都發生在這麼快的這麼短的時間段內,還沒有真正的輸入。嘗試將analyser.getByteTimeDomainData()調用及其之後的循環包裝在1000ms的setTimeout中,然後在您授予瀏覽器錄製權限時立即向您的麥克風吹口哨。你應該看到比128

下面是一個例子其他一些值:http://jsbin.com/avasav/5/edit

+0

嘿感謝您的答覆。是的,我忘了將輸入連接到分析器:(。問題是當我使用你的代碼時,有一段時間數組停止填充,我怎樣才能讓它始終收集我的值? – user2039789 2013-04-04 07:33:47

+0

你需要一個JavaScriptNode。看看這個:http://jsbin.com/avasav/7/edit – 2013-04-04 12:39:51