2015-10-18 2 views
1

Я пытался захватить громкость в реальном времени с входа микрофона через webaudio api. После прочтения некоторых статей я думал, что что-то работает, но кажется, что объем возвращаемого из анализатора и scriptprocessor всегда равен 0.Объем входного микрофона для webaudio всегда 0

обновляется, так что «микрофон» используются в качестве источника данных

// detect support for different browsers 
    navigator.getUserMedia = (navigator.getUserMedia || 
           navigator.webkitGetUserMedia || 
           navigator.mozGetUserMedia || 
           navigator.msGetUserMedia); 

    var Mosquito = { 

     setup : function(){ 
      // ask permission to grab the mic 
      var stream = navigator.getUserMedia({ audio: true }, Mosquito.successCallback, Mosquito.errorCallback); 
    }, 

    successCallback : function(localMediaStream){ 
     var audioContext = new AudioContext(); 

     // hook up the mic to the mediaStreamSource in audioContext 
     var microphone = audioContext.createMediaStreamSource(localMediaStream); 
     Mosquito.processAudio(microphone, audioContext); 
    }, 

    processAudio : function(microphone, audioContext){ 
     // analyze a piece of the signal 
     var analyser = audioContext.createAnalyser(); 
     analyser.smoothingTimeConstant = 0.3; // make it less jizzy 
     analyser.fftSize = 512; 

     // create a scriptProcessor in order to read out the analyser data 
     var javascriptNode = audioContext.createScriptProcessor(2048, 1, 1); 

     // connect all the things 
     microphone.connect(analyser); 
     analyser.connect(javascriptNode); 
     javascriptNode.connect(audioContext.destination); 


     javascriptNode.onaudioprocess = function(e){ 
      var array = new Uint8Array(analyser.frequencyBinCount); 
      analyser.getByteFrequencyData(array); 
      console.log(array); 
      var average = Mosquito.getAverageVolume(array); 
      console.log(average); 
      Mosquito.drawMeters(average); 
     }; 
    }, 

    drawMeters : function(average){ 
     document.getElementById("meter").innerHTML = average; 
    }, 

    getAverageVolume : function(array){ 
     var values = 0; 
     var average; 

     var length = array.length; 

     // get all the frequency amplitudes 
     for (var i = 0; i < length; i++) { 
      values += array[i]; 
     } 

     average = values/length; 
     return average; 
    }, 

    errorCallback : function(){ 
     console.log('nope'); 
    } 
} 
Mosquito.setup(); 

Спасибо, что нашли время, чтобы взглянуть на то, что я делаю неправильно, веб-аудио еще очень новое для меня :)

ответ

0

Почему вы создаете buffersource? Вы должны просто подключить источник mediastreamsource (который в настоящее время не подключен, поэтому вы не получаете никаких данных).

+0

Спасибо, я переименовал свою переменную в «микрофон» и действительно увидел, что я не использовал это как источник медиаистории. – Jorre

+0

любая идея, почему анализатор останавливается через пару секунд или я должен открыть для него новые вопросы? – Jorre

+0

Я ожидаю, что это связано с тем, что ваш анализатор и javascriptNode объявлены внутри функции processAudio, и они в конечном итоге собирают мусор - попробуйте объявить их глобально. – cwilso

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