2013-12-16 10 views
9

buduję prostą aplikację, w której próbuję dostać bufor, ale wydaje się, że onaudio proces w poniższym kodzie nie jest wypalania: (PasteBin)Javascript API Audio: onaudioprocess nie opalane

<script> 
var audio_context; 
var recorder; 
window.onload = function init() { 
    try { 
     window.AudioContext = window.AudioContext || window.webkitAudioContext; 
     navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia; 
     window.URL = window.URL || window.webkitURL; 
     audio_context = new AudioContext; 
     } catch (e) { 
     console.log(e); 
    } 
    navigator.getUserMedia({audio: true}, startUserMedia); 
    function startUserMedia(stream) { 
     console.log('Initializing'); 
     var input = audio_context.createMediaStreamSource(stream); 
     input.connect(audio_context.destination); 
     var node = input.context.createGain(4096, 2, 2); 
     node.onaudioprocess = function(e){ 
      console.log('done'); 
     } 
     node.connect(audio_context.destination); 
    } 
}; 
</script> 

Jeśli kod działa tak, jak powinien, powinienem dostać Initiliazing \n done, problem polega na tym, że dostaję tylko Initiazing i onaudioprocess nie jest uruchamiany. Używam najnowszą chrome:

enter image description here

+0

Spróbuj użyć 'addEventListener' zamiast' onaudioprocess' – Musa

+0

Niestety, nie mogłem pracować z addEventListener :( – Deepsy

Odpowiedz

8

onaudioprocess nie jest właściwością GainNode, ale ScriptProcessorNode. Zobacz API reference here.

Nie jestem doświadczony z Web Audio API, ale jeśli dobrze zrozumiałem trzeba włożyć między zyskasz węzeł i miejsce docelowe, aby móc przetwarzać te wydarzenia:

var node = input.context.createGain(4096, 2, 2); 
var processor = input.context.createScriptProcessor(4096,1,1); 

processor.onaudioprocess = function(e){ 
    console.log('done'); 
} 

node.connect(processor); 
processor.connect(audio_context.destination); 

Example at jsFiddle. Jak widać, drukuje on done do konsoli podczas przetwarzania strumienia, ale nie mogę powiedzieć nic o poprawności tej konfiguracji (ponieważ, jak powiedziałem, mało doświadczenia), więc proszę dwukrotnie sprawdzić połączenia między węzłami - i jeśli to konieczne dostosuj pierwszy parametr (rozmiar bufora).


Uwaga: Jestem zakładając, chcesz zrobić coś, co zmienia strumień (nie było jasne, w swoim pytaniu). Jeśli chcesz do czegoś innego (na przykład, po prostu przeanalizuj), ale nie zmienisz danych wejściowych, możesz połączyć te węzły, tak jak wcześniej (node i destination) i utworzyć ScriptProcessorNode z jednym wejściem, ale bez wyjść:

var node = input.context.createGain(4096, 2, 2); 
node.connect(audio_context.destination); 

var processor = input.context.createScriptProcessor(4096,1,0); 

processor.onaudioprocess = function(e){ 
    console.log('done'); 
} 

node.connect(processor); 
3

można też ominąć zdarzenie WebAudio i używać własne timeupdate zdarzenie dźwiękowej. Może to być przydatne, jeśli nie potrzebujesz zdarzenia o wysokiej rozdzielczości (takiego jak audioprocess).

W przeciwieństwie do audioprocess, timeupdate jest wypalanie tylko wtedy, gdy pozycja audio jest zmieniany: gdy jest to faktycznie gra albo szukać innej pozycji. Mówi się, że strzela raz w około 250 ms (więc ma niską częstotliwość, a więc bardziej wydajną).

function startUserMedia(stream) { 
    stream.ontimeupdate = function() { 
     console.log(stream.currentTime); 
    }; 
    /* … */ 
} 

PS:
W twoim przykładzie chcesz console.log('done') w obsłudze onaudioprocess. To sprawia, że ​​myślę, że źle rozumiesz cel tego wydarzenia. Jest uruchamiany w sposób ciągły, nie raz, gdy coś jest zrobione ze strumieniem.

Powiązane problemy