2013-12-16 13 views
9

Sto costruendo una semplice applicazione in cui sto cercando di ottenere il buffer, ma sembra che processo onaudio nel seguente codice non è sparare: (PasteBin)Javascript API Audio: onaudioprocess non sparato

<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> 

Se il codice funziona come dovrebbe, dovrei ottenere Initiliazing \n done, il problema è che sto ricevendo solo Initiazing e che il processo onaudi non è stato attivato. Sto utilizzando il cromo lastest:

enter image description here

+0

Provare a utilizzare 'addEventListener' invece di' onaudioprocess' – Musa

+0

Purtroppo, non riuscivo a farlo funzionare con addEventListener :( – Deepsy

risposta

8

onaudioprocess non è una proprietà di GainNode, ma di ScriptProcessorNode. Vedi lo API reference here.

Non sto veramente sperimentato con API Web Audio, ma se ho capito bene è necessario inserire fra guadagnate nodo e la destinazione di essere in grado di elaborare quegli eventi:

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. Come puoi vedere, sta stampando done sulla console mentre lo stream viene elaborato, ma non posso dire nulla sulla correttezza di questa configurazione (poiché, come ho detto, poca esperienza) quindi controlla due volte le connessioni tra i nodi - e se necessario regola il primo parametro (la dimensione del buffer).


Nota: sto supponendo che si vuole fare qualcosa che altera il flusso (non era chiaro in questione). Se vuoi fare qualcos'altro (ad esempio, basta analizzarlo) ma non cambierà l'input, puoi collegare i nodi come prima (node e destination) e creare lo ScriptProcessorNode con un input ma senza output:

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

È anche possibile ignorare l'evento WebAudio e utilizzare proprio timeupdate evento di Audio. Potrebbe essere adatto al tuo scopo se non hai bisogno di un evento ad alta risoluzione (come ad esempio audioprocess).

al contrario di audioprocess, timeupdate sta sparando solo quando la posizione audio viene modificato: quando in realtà è in riproduzione o si cerca di un'altra posizione. Si dice che spari una volta in circa 250 ms (quindi è a bassa frequenza e quindi più performante).

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

P.S.
Nell'esempio, si desidera console.log('done') nel gestore onaudioprocess. Questo mi fa pensare che tu abbia frainteso lo scopo dell'evento. Viene sparato continuamente, non una volta che qualcosa viene fatto con il flusso.