2013-04-09 149 views
3

我使用的是HTML5 webkitAudioContext使用這個下面的代碼獲取一個用戶的麥克風的實時等級:HTML5音頻緩衝區陷入

var liveSource; 

function getLevel(){ 
    var context = new webkitAudioContext(); 

    navigator.webkitGetUserMedia({audio: true}, function(stream) { 

     liveSource = context.createMediaStreamSource(stream); 
     liveSource.connect(context.destination); 

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

     levelChecker.connect(context.destination); 

     levelChecker.onaudioprocess = function(e) { 

      var buffer = e.inputBuffer.getChannelData(0); 


     var maxVal = 0; 
     // Iterate through buffer to check if any of the |values| exceeds 1. 
     for (var i = 0; i < buffer.length; i++) { 
      if (maxVal < buffer[i]) { 
       maxVal = buffer[i]; 
      } 
     } 
     if(maxVal <= 0.01){ 
      console.log(0.0); 
     } else if(maxVal > 1){ 
      console.log(1); 
     } else if(maxVal > 0.2){ 
      console.log(0.2); 
     } else if(maxVal > 0.1){ 
      console.log(0.1); 
     } else if(maxVal > 0.05){ 
      console.log(0.05); 
     } else if(maxVal > 0.025){ 
      console.log(0.025); 
     } else if(maxVal > 0.01){ 
      console.log(0.01); 
     } 
}; 
}); 

} 

getLevel(); 

如果您複製並粘貼到您的控制檯,然後單擊你的手指靠近你的麥克風(假設你已經啓用麥克風輸入),你會看到它工作幾秒鐘,然後突然停止。它不報告任何錯誤。有人可以解釋爲什麼會發生這種情況嗎?謝謝

查看http://labs.dinahmoe.com/dynamicmusicengine/爲一個例子,其中的水平正常工作。

+0

這個bug ...我討厭這個bug。 https://code.google.com/p/chromium/issues/detail?id=82795 – Brad 2014-01-19 17:45:03

回答

3

我有同樣的問題,但終於得到了解決方案!問題是JavaScript節點cicle。 我建議你先更改createJavaScriptNode():

var levelChecker = context.createScriptProcessor(4096, 1 ,1); 

垃圾收集器與「levelChecker」變量和他onaudioprocess一個問題,所以你必須在scriptprocessor或onaudioProcess回調到窗口綁定。在這裏,HOLY SOLUTION:

levelChecker.onaudioprocess = window.audioProcess = function(e) { ... 

只需添加window.audioProcess在該行,你將永遠與達問題解決了。

在這裏你可以找到進一步的信息:http://lists.w3.org/Archives/Public/public-audio/2013JanMar/0304.html

希望對你有用!

+0

這就解決了,謝謝! – Lars 2013-11-22 10:08:25