2013-04-08 216 views
3

在先前的堆棧溢出問題獲取音頻電平,我發現這個代碼:從HTML5音頻麥克風流

<script> 
// this is to store a reference to the input so we can kill it later 
var liveSource; 
// creates an audiocontext and hooks up the audio input 
function connectAudioInToSpeakers(){ 
    var context = new webkitAudioContext(); 
    navigator.webkitGetUserMedia({audio: true}, function(stream) { 
    console.log("Connected live audio input"); 
    liveSource = context.createMediaStreamSource(stream); 
    liveSource.connect(context.destination); 
    console.log(liveSource); 
    }); 
} 
// disconnects the audio input 
function makeItStop(){ 
    console.log("killing audio!"); 
    liveSource.disconnect(); 
} 
// run this when the page loads 
connectAudioInToSpeakers(); 
</script> 

這需要從用戶的麥克風音頻並將其播放通過揚聲器。我想要的是輸入的電平(幅度)(例如,如果發生削波,或者告訴用戶他們需要說出來,我可以顯示紅色警告)。在上面的代碼中,我怎樣才能真正掌握原始數據?

例如,如何將實際數字記錄到控制檯?我猜這些都存儲在liveSoure中?

我不需要任何聰明的畫布動畫等,只是一個數字,告訴我輸入是多麼大聲。這是相對簡單的嗎?如果是這樣,它是如何完成的?

感謝

回答

6

以下是我做到了 - 你能活着看到它http://labs.dinahmoe.com/dynamicmusicengine/只是liveSource連接到這個JavaScriptNode(也有context.createScriptProcessor(4096,1,1),這是新的語法,雖然雙方將支持根據http://www.w3.org/2011/audio/wiki/F2F_Mar_2013

var levelChecker = context.createJavaScriptNode(4096, 1 ,1); 
liveSource.connect(levelChecker); 
levelChecker.connect(context.destination); 

levelChecker.onaudioprocess = function(e) { 
     var buffer = e.inputBuffer.getChannelData(0); 

     // Iterate through buffer to check if any of the values exceeds 1. 
     for (var i = 0; i < buffer.length; i++) { 
      if (1 =< buffer[i]) { 
       console.log("Oh noes! We got a peak.", buffer[i]); 
      } 
     } 
+0

這是非常感謝。 – Lars 2013-04-09 10:19:20

+0

只要實際添加,它似乎只能工作幾秒鐘,然後停止工作。你知道爲什麼嗎?我已經把它放在一個單獨的問題在這裏:http://stackoverflow.com/questions/15900103/html5-audio-buffer-getting-stuck謝謝 – Lars 2013-04-09 11:32:12

+0

這是值得的,這種方法是非常低效的。然而,如果你想得到樣品的真實峯值,這是必需的。更快的方法是使用來自分析儀節點的時域數據,但您可能會錯過一些峯。如果你只是在做可視化,這可能無關緊要。 – Brad 2014-01-19 17:44:17