Подтвердить что ты не робот

Анализатор API веб-аудио Node Не работает с микрофонным входом

Теперь исправлена ​​ошибка, предотвращающая вход микрофона на http://code.google.com/p/chromium/issues/detail?id=112367 для Chrome Canary. Кажется, эта часть работает. Я могу назначить микрофонный вход аудиоэлементу и услышать результаты через динамик.

Но я хотел бы подключить анализатор node, чтобы сделать FFT. Анализатор node отлично работает, если я устанавливаю источник звука в локальный файл. Проблема заключается в том, что при подключении к звуковому потоку микрофона анализатор node просто возвращает базовое значение, как будто у него вообще нет аудиопотока. (Это -100 снова и снова, если вам интересно.)

Кто-нибудь знает, что? Разве это еще не реализовано? Это хромированная ошибка? Я запускаю 26.0.1377.0 в Windows 7 и включил флаг getUserMedia и обслуживаю через localhost через python simpleHTTPServer, чтобы он мог запрашивать разрешения.

код:

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

Опять же, если я установил audio.src в прокомментированную версию, он работает, но с микрофоном это не так. Процесс содержит:

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

Я также пытался использовать createMediaStreamSource и обходить аудио-элемент - пример 4 - https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/webrtc-integration.html. Также неудачно.: (

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

Я предполагаю, что можно было бы написать mediasteam в буфер, а затем использовать dsp.js или что-то сделать fft, но сначала я хотел проверить, прежде чем идти по этой дороге.

4b9b3361

Ответ 1

Это была проблема с переменным охватом. Во втором примере я определял микрофон локально, а затем пытался получить доступ к его потоку с помощью анализатора в другой функции. Я просто сделал все веб-интерфейсы API API глобальными для спокойствия. Также для анализатора node требуется несколько секунд, чтобы начать сообщать значения не -100. Рабочий код для заинтересованных:

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

Если вы хотите услышать живое аудио, вы можете подключить анализатор к месту назначения (динамикам), как указано выше. Следите за прекрасной обратной связью, хотя!