2013-01-09 18 views
11

Il bug che impedisce l'ingresso del microfono per http://code.google.com/p/chromium/issues/detail?id=112367 per Chrome Canary è stato corretto. Questa parte sembra funzionare. Posso assegnare l'ingresso mic a un elemento audio e ascoltare i risultati attraverso l'altoparlante.Nodo dell'analizzatore API audio Web non funzionante con ingresso microfono

Ma mi piacerebbe collegare un nodo dell'analizzatore per fare FFT. Il nodo dell'analizzatore funziona correttamente se si imposta la sorgente audio su un file locale. Il problema è che quando si è collegati al flusso audio del microfono, il nodo dell'analizzatore restituisce semplicemente il valore di base come se non avesse affatto un flusso audio. (È sempre -100 se sei curioso.)

Qualcuno sa cosa succede? Non è ancora implementato? È un bug di Chrome? Sto eseguendo 26.0.1377.0 su Windows 7 e ho abilitato il flag getUserMedia e sto servendo tramite localhost tramite il semplice server HHTTPS in modo che possa richiedere le autorizzazioni.

Codice:

var aCtx = new webkitAudioContext(); 
var analyser = aCtx.createAnalyser(); 
if (navigator.getUserMedia) { 
    navigator.getUserMedia({audio: true}, function(stream) { 
    // audio.src = "stupid.wav" 
    audio.src = window.URL.createObjectURL(stream); 
    }, onFailure); 
} 
$('#audio').on("loadeddata",function(){ 
    source = aCtx.createMediaElementSource(audio); 
    source.connect(analyser); 
    analyser.connect(aCtx.destination); 
    process(); 
}); 

Anche in questo caso, se ho impostato audio.src alla versione commentata, funziona, ma con il microfono non lo è. Processo contiene:

FFTData = new Float32Array(analyser.frequencyBinCount); 
analyser.getFloatFrequencyData(FFTData); 
console.log(FFTData[0]); 

Ho provato anche con il createMediaStreamSource e bypassando l'elemento audio - esempio 4-https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/webrtc-integration.html. Anche senza successo. :(

if (navigator.getUserMedia) { 
     navigator.getUserMedia({audio: true}, function(stream) { 
     var microphone = context.createMediaStreamSource(stream); 
     microphone.connect(analyser); 
     analyser.connect(aCtx.destination); 
     process(); 
    } 

immagino che potrebbe essere possibile scrivere la mediasteam in un buffer e quindi utilizzare dsp.js o qualcosa a che fare FFT, ma ho voluto verificare prima di andare su questa strada.

+0

Avete ispezionato l'intero array FFTData? Ho notato che sei solo console. Registrando il primo elemento. AnalyserNode dovrebbe funzionare con l'ingresso del microfono ... –

+0

La funzione di processo passa poi su un visualizzatore di canvas, tutti i valori sono -100. Sto controllando cose come scope variabili e ho intenzione di provarlo su un mac presto. Davvero non so cosa sta succedendo. – Newmu

risposta

7

Si trattava di un problema con scope variabile: per il secondo esempio, stavo definendo il microfono localmente e poi tentando di accedere al suo stream con l'analizzatore in un'altra funzione, ho solo reso tutti i nodi Web API API globali per la massima tranquillità. richiede alcuni secondi affinché il nodo dell'analizzatore inizi a riportare valori diversi da 100. Codice di lavoro per gli interessati:

// Globals 
var aCtx; 
var analyser; 
var microphone; 
if (navigator.getUserMedia) { 
    navigator.getUserMedia({audio: true}, function(stream) { 
     aCtx = new webkitAudioContext(); 
     analyser = aCtx.createAnalyser(); 
     microphone = aCtx.createMediaStreamSource(stream); 
     microphone.connect(analyser); 
     // analyser.connect(aCtx.destination); 
     process(); 
    }); 
}; 
function process(){ 
    setInterval(function(){ 
     FFTData = new Float32Array(analyser.frequencyBinCount); 
     analyser.getFloatFrequencyData(FFTData); 
     console.log(FFTData[0]); 
    },10); 
} 

Se si desidera ascoltare l'audio dal vivo, è possibile collegare l'analizzatore alla destinazione (altoparlanti) come descritto sopra. Attenzione però per un bel feedback!

+0

Mi dà valori superiori a 100 ogni volta. Ti ricordi qual era il problema che hai avuto? Grazie! – jbartolome

+0

Il punto qui è che il microfono viene creato come 'aCtx.createMediaStreamSource (stream);'. Creando un nodo audio come "audio.src = URL.createObjectURL (stream)" non riesce a restituire valori nell'analizzatore audio. –

+0

Ciao! Sto ricevendo tutte le frequenze negative ma non -100. Non dovrebbero esserci anche valori positivi? – monisha

Problemi correlati