Анализатор 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, но сначала я хотел проверить, прежде чем идти по этой дороге.
Ответы
Ответ 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);
}
Если вы хотите услышать живое аудио, вы можете подключить анализатор к месту назначения (динамикам), как указано выше. Следите за прекрасной обратной связью, хотя!