2013-01-09 73 views
11

現在修正了Chrome Chrome Can每個http://code.google.com/p/chromium/issues/detail?id=112367阻止麥克風輸入的錯誤。這部分似乎工作。我可以將麥克風輸入分配給音頻元素,並通過揚聲器收聽結果。網絡音頻API分析器節點未與麥克風輸入配合使用

但我想連接分析儀節點,以便做FFT。如果我將音頻源設置爲本地文件,分析器節點工作正常。問題是,當連接到麥克風音頻流時,分析儀節點只是返回基本值,就好像它根本沒有音頻流一樣。 (如果你好奇,它會一遍又一遍的重複。)

任何人都知道這是怎麼回事?它尚未實施?這是一個鉻錯誤?我在Windows 7上運行26.0.1377.0,並啓用了getUserMedia標誌,並通過本地主機通過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,但我想先檢查之前,我這條路走。

+0

您是否檢查過整個FFTData數組?我注意到你只是console.logging的第一個元素。 AnalyserNode應該與麥克風輸入一起工作... –

+0

進程函數進一步將其傳遞到畫布可視化器上,所有值都是-100。我正在檢查諸如變量範圍的事情,並且很快就會在Mac上嘗試它。真的不知道發生了什麼事。 – Newmu

回答

7

這是一個變量範圍問題,對於第二個例子,我在本地定義了麥克風,然後嘗試使用另一個函數中的分析器訪問它的流,我只是爲了安心使所有的Web Audio API節點全局化。分析儀節點需要幾秒鐘才能開始報告非-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); 
} 

如果您希望聽到現場音頻,可以將分析儀連接到上述註釋的目的地(揚聲器)。請注意一些可愛的反饋!

+0

它給我所有時間超過-100的值。你記得你有什麼問題嗎?謝謝! – jbartolome

+0

這裏的要點是麥克風被創建爲'aCtx.createMediaStreamSource(stream);'。像audio.src = URL.createObjectURL(stream)一樣用音頻節點創建它;'無法在音頻分析器中返回值。 –

+0

你好!我得到所有負頻率,但不是-100。不應該有積極的價值觀嗎? – monisha