2013-04-08 4 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

+0

Просто собираюсь добавить на самом деле, кажется, что он работает всего несколько секунд, а затем перестает работать. Ты знаешь почему? Я поставил здесь отдельный вопрос: http://stackoverflow.com/questions/15900103/html5-audio-buffer-getting-stuck Спасибо – Lars

+0

Для чего это стоит, этот метод очень неэффективен. Однако это необходимо, если вы хотите получить истинные пики в наборе образцов. Более быстрый метод - использовать данные временной области из узла анализатора, но вы можете пропустить некоторые пики. Это не имеет значения, если вы просто делаете визуализацию. – Brad

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