2017-05-09 48 views
1

我有我的應用程序中預先錄製的音頻文件的音頻緩衝區。 我試圖讓整個音軌的頻域數據,這是我已經試過:網絡音頻分析整個緩衝區

getAudioDataFromBuffer: function(buf){ 
    var src = g.audioContext.createBufferSource(); 
    src.buffer = buf; 
    var anal = src.context.createAnalyser(); 
    src.connect(anal); 
    var dataArray = new Uint8Array(buf.length); 
    anal.fftSize = 2048; 
    anal.getByteFrequencyData(dataArray); 
    return dataArray; 
}, 

但這只是給了我一個數組全是零。

我需要這個比較兩個音軌,一個是預先錄製的,另一個是錄製在應用程序中。我在想我可以測量他們的頻率域之間的相關性。

+2

只是注意:不要縮短「分析」:d – NoOorZ24

+0

我如何從渠道得到的數據頻域數據?我試圖直接測量通道數據之間的相關性,但我不喜歡結果。 @Kaiido –

+0

@ NoOorZ24如果是這樣的話,你也永遠不會看到'dic'作爲變量名或者整個C++中的std'庫 – Matthias

回答

0

我想你需要更多像

AudioBuffer.getChannelData()

返回包含與所述信道相關的PCM數據,由信道參數定義的Float32Array(其中0表示第一信道)。

查看Mozilla或W3C文檔。

乾杯

基利安

0

我到達的解決方案看this answerthis discussion

基本上你需要使用一個OfflineAudioContext。下面的代碼從已加載的音頻緩衝盯着:

var offline = new OfflineAudioContext(2, buffer.length ,44100); 
var bufferSource = offline.createBufferSource(); 
bufferSource.buffer = buffer; 

var analyser = offline.createAnalyser(); 
var scp = offline.createScriptProcessor(256, 0, 1); 

bufferSource.connect(analyser); 
scp.connect(offline.destination); // this is necessary for the script processor to start 

var freqData = new Uint8Array(analyser.frequencyBinCount); 
scp.onaudioprocess = function(){ 
    analyser.getByteFrequencyData(freqData); 
    console.log(freqData); 
}; 

bufferSource.start(0); 
offline.oncomplete = function(e){ 
    console.log('analysed'); 
}; 
offline.startRendering();