2013-01-09 16 views
11

Błąd uniemożliwiający uzyskanie wejścia mikrofonowego na http://code.google.com/p/chromium/issues/detail?id=112367 dla Chrome Canary został naprawiony. Ta część wydaje się działać. Mogę przypisać wejście mikrofonowe do elementu audio i usłyszeć wyniki przez głośnik.Węzeł interfejsu API sieci audio nie działa z wejściem mikrofonu

Ale chciałbym podłączyć węzeł analizatora, aby wykonać FFT. Węzeł analizatora działa dobrze, jeśli ustawię źródło dźwięku na plik lokalny. Problem polega na tym, że po podłączeniu do mikrofonowego strumienia audio, węzeł analizatora po prostu zwraca wartość podstawową, tak jakby w ogóle nie miał strumienia audio. (To jest -100 raz za razem, jeśli jesteś ciekawy.)

Ktoś wie, co jest grane? Czy nie jest jeszcze wdrożony? Czy to jest błąd chrome? Używam 26.0.1377.0 na Windows 7 i mam włączoną flagę getUserMedia i wyświetlam localhost za pośrednictwem simpleHTTPServer Pythona, aby mógł on żądać uprawnień.

Kod:

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

Ponownie, jeśli ustawić audio.src wersji skomentował to działa, ale z mikrofonu nie jest. Proces zawiera:

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

Ja również próbowałem za pomocą createMediaStreamSource i pomijając element dźwięku - Przykład 4 - https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/webrtc-integration.html. Również nie powiodło się. :(

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

sobie wyobrazić, może to być możliwe, aby napisać mediasteam do bufora, a następnie użyć dsp.js lub coś zrobić FFT, ale chciałem najpierw sprawdzić zanim pójdę tą drogą.

+0

Czy sprawdziłeś całą tablicę FFTData? Zauważyłem, że jesteś po prostu konsolą. Porzucając pierwszy element. Węzeł AnalyserNode powinien działać z wejściem mikrofonu ... –

+0

Funkcja procesu przekazuje ją dalej do wizualizatora canvas, wszystkie wartości wynoszą -100. Sprawdzam zmienne scoping i wkrótce wypróbuję na mac. Naprawdę nie wiem co się dzieje. – Newmu

Odpowiedz

7

To był problem ze zmienną skalą.W drugim przykładzie, lokalnie definiowałem mikrofon, a następnie próbowałem uzyskać dostęp do jego strumienia za pomocą analizatora w innej funkcji. Po prostu zrobiłem wszystkie globalne węzły API Web Audio dla spokoju ducha. trwa kilka sekund, zanim węzeł analizatora rozpocznie raportowanie wartości innych niż 100. Kod roboczy dla zainteresowanych:

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

Jeśli chcesz usłyszeć dźwięk na żywo, możesz podłączyć analizator do miejsca docelowego (głośników) zgodnie z powyższym komentarzem. Uważaj jednak na piękne opinie!

+0

Daje mi wartości ponad -100 cały czas. Czy pamiętasz, jaki miałeś problem? Dzięki! – jbartolome

+0

Chodzi o to, że mikrofon jest tworzony jako 'aCtx.createMediaStreamSource (stream);'. Tworzenie go za pomocą węzła audio, takiego jak 'audio.src = URL.createObjectURL (stream);' nie zwraca wartości w analizatorze audio. –

+0

Hello! Otrzymuję wszystkie ujemne częstotliwości, ale nie -100. Czy nie powinno być również wartości pozytywnych? – monisha

Powiązane problemy