2013-01-09 6 views
11

Der Fehler verhindert Mikrofoneingang für Chrome Canary pro http://code.google.com/p/chromium/issues/detail?id=112367 bekommen ist nun behoben. Dieser Teil scheint zu funktionieren. Ich kann den Mikrofoneingang einem Audioelement zuweisen und die Ergebnisse über den Lautsprecher hören.Web Audio API Analyzer Knoten funktioniert nicht mit Mikrofon-Eingang

Aber ich möchte einen Analysator Knoten verbinden, um FFT zu tun. Der Analyseknoten funktioniert einwandfrei, wenn ich die Audioquelle auf eine lokale Datei einstelle. Das Problem besteht darin, dass der Analyseknoten, wenn er mit dem Mikrofon-Audiostream verbunden ist, nur den Basiswert zurückgibt, als ob er überhaupt keinen Audiostream hätte. (Es ist -100 immer und immer wieder, wenn Sie neugierig sind.)

Wer weiß, was ist los? Ist es noch nicht implementiert? Ist das ein Chrom Bug? Ich verwende 26.0.1377.0 unter Windows 7 und habe das getUserMedia-Flag aktiviert und über localhost über python's simpleHTTPServer bedient, so dass es Berechtigungen anfordern kann.

Code:

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(); 
}); 

Noch einmal, wenn ich auf die kommentierte Version gesetzt audio.src, es funktioniert, aber mit Mikrofon ist es nicht. Verfahren enthält:

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

ich auch die createMediaStreamSource habe versucht, mit und unter Umgehung des Audio-Element - Beispiel 4-https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/webrtc-integration.html. Auch nicht erfolgreich. :(

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

Ich stelle mir es möglich sein könnte, die mediasteam in einen Puffer zu schreiben und dann dsp.js oder etwas verwenden fft zu tun, aber ich wollte zuerst überprüfen, bevor ich diesen Weg gehen.

+0

Haben inspiziert Sie die gesamte FFTData Array? Ich habe bemerkt, dass du nur console.logging das erste Element. Der AnalyserNode sollte mit Mikrofoneingang arbeiten ... –

+0

Die Prozessfunktion übergibt ihn weiter an einen Canvas-Visualizer, alle Werte sind -100. Ich überprüfe Dinge wie variable Scoping und werde es bald auf einem Mac versuchen. Ich weiß wirklich nicht, was passiert. – Newmu

Antwort

7

Es handelte sich um ein Problem mit dem Variablen-Scoping.Für das zweite Beispiel habe ich das Mikrofon lokal definiert und dann versucht, mit dem Analyzer in einer anderen Funktion auf seinen Stream zuzugreifen.Ich habe gerade alle WebAudio-API-Knoten zur Sicherheit global gemacht dauert einige Sekunden, bis der Analysator Knoten Berichterstattung nicht -100 Werte starten für die Interessenten Arbeitscode.

// 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); 
} 

Wenn Sie die Live-Audio hören möchten, können Sie den Analysator zum Ziel (Lautsprecher) verbinden, wie oben ausgeführt werden. Achten Sie jedoch auf ein schönes Feedback!

+0

Es gibt mir Werte über -100 alle Zeit. Erinnerst du dich, was das Problem war, das du hattest? Vielen Dank! – jbartolome

+0

Der Punkt hier ist, dass das Mikrofon als 'aCtx.createMediaStreamSource (stream);' erstellt wird. Das Erstellen mit Audioknoten wie 'audio.src = URL.createObjectURL (stream);' kann keine Werte im Audio Analyzer zurückgeben. –

+0

Hallo! Ich bekomme alle negativen Frequenzen, aber nicht -100. Sollte es auch keine positiven Werte geben? – monisha

Verwandte Themen