2017-05-09 46 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();