2013-04-09 5 views
3

J'utilise le HTML5 webkitAudioContext pour obtenir les niveaux en temps réel du microphone d'un utilisateur en utilisant ce code suivant:HTML5 audio se coince

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(); 

Si vous copiez et collez ceci dans votre console et cliquez sur vos doigts près de votre microphone (en supposant que vous avez activé l'entrée microphone), vous verrez que cela fonctionne pendant quelques secondes, puis s'arrête soudainement. Il ne signale aucune erreur. Quelqu'un peut-il expliquer pourquoi cela se passe? Merci

Voir http://labs.dinahmoe.com/dynamicmusicengine/ pour un exemple où les niveaux fonctionnent correctement.

+0

Ce bug ... Je déteste ce bug. https://code.google.com/p/chromium/issues/detail?id=82795 – Brad

Répondre

3

J'ai eu le même problème mais j'ai enfin trouvé la solution! Le problème est le cicle du noeud javascript. je vous suggère de changer le createJavaScriptNode() d'abord:

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

Le garbage collector a un problème avec variable « levelChecker » et son onaudioprocess, donc vous devez lier le scriptProcessor ou le rappel onaudioProcess à la fenêtre. Ici, la SOLUTION SAINT:

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

Il suffit d'ajouter window.audioProcess dans cette ligne et vous ne serez jamais face à problème tat plus.

vous pouvez trouver plus d'informations: http://lists.w3.org/Archives/Public/public-audio/2013JanMar/0304.html

Espoir qui fonctionne pour vous!

+0

C'est résolu, merci! – Lars