2014-06-21 7 views
7

Sto usando il callback onaudioprocess di ScriptProcessorNode per elaborare l'input del microfono. Collegando MediaStreamSourceNode allo ScriptProcessorNode, posso ottenere i dati audio grezzi all'interno della funzione di callback onaudioprocess. Tuttavia, dopo circa 30 secondi (che varia da 10 a 35 secondi), il browser interrompe la chiamata a un processo audio. Nel seguente codice, l'output di console.log ('>>') si arresta sempre dopo circa 30 secondi.Chrome: onaudioprocess smette di chiamare dopo un po 'di tempo

var ctx = new AudioContext(); 
var BUFFER_LENGTH = 4096; 
console.log('Buffer length is + ' + BUFFER_LENGTH); 
navigator.webkitGetUserMedia({audio: true}, function (stream) { 
    var mediaStreamSource = ctx.createMediaStreamSource(stream); 
    var scriptProcessor = ctx.createScriptProcessor(BUFFER_LENGTH, 1, 1); 
    scriptProcessor.onaudioprocess = function (e) { 
     console.log('>>'); 
    }; 
    scriptProcessor.connect(ctx.destination); 
}, function(e) { 
    console.error('Unable to get audio input source.'); 
}); 

Ho provato tutte le possibili BUFFER_LENGTH (256, 512, 1024, 2048, 4096, 8192, 16384), ma la situazione non cambia (log arresta dopo 30 sec.) Ho osservato questo problema in l'ultima versione di Chrome (versione 35.0.1916.153) e Canary (versione 37.0.2060.3 canarino). Qualcuno sa qualche soluzione alternativa?

+0

Mi chiedo se abbia a che fare con il fatto che stai restituendo e.outputbuffer vuoti nei tuoi callback onaudioprocess. Dopo 30 secondi alla visualizzazione dei buffer vuoti, Chrome potrebbe voler risparmiare batteria/potenza di elaborazione e disattivare la richiamata. – notthetup

+0

Grazie notthetup, ho provato a copiare inputBuffer in outputBuffer in onaudioprocess. Ma non ha risolto il problema. Ecco il codice: var source = e.inputBuffer.getChannelData (0); var dest = e.outputBuffer.getChannelData (0); dest.set (origine); – kuu

risposta

23

Sembra più che il tuo oggetto scriptprocessor stia recuperando dati inutili. Prova a salvarlo in una variabile globale e vedi se questo risolve il problema.

+0

Grazie, Chris. Come hai detto, il salvataggio di ScriptProcessorNode in una variabile globale risolveva questo problema. Ma penso che questo comportamento (garbage collection che raccoglie un nodo ancora connesso) debba essere corretto. È già stato archiviato come un bug? – kuu

+1

Se ricordo correttamente, la destinazione AudioContext non mantiene un riferimento a ScriptProcessor. Quindi la raccolta dei rifiuti di ScriptProcessor è effettivamente appropriata qui, perché nulla ha un riferimento ad esso. –

+0

ho trovato un bug aperto che sembra essere correlato a questo problema: https://bugs.webkit.org/show_bug.cgi?id=112521 Sembra una patch è stata suggerita l'anno scorso, ma non è ancora accettato. – kuu