网络音频分析整个缓冲区
问题描述:
我有我的应用程序中预先录制的音频文件的音频缓冲区。 我试图让整个音轨的频域数据,这是我已经试过:网络音频分析整个缓冲区
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;
},
但这只是给了我一个数组全是零。
我需要这个比较两个音轨,一个是预先录制的,另一个是录制在应用程序中。我在想我可以测量他们的频率域之间的相关性。
答
我想你需要更多像
AudioBuffer.getChannelData()
返回包含与所述信道相关的PCM数据,由信道参数定义的Float32Array(其中0表示第一信道)。
查看Mozilla或W3C文档。
干杯
基利安
答
我到达的解决方案看this answer和this 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();
只是注意:不要缩短“分析”:d – NoOorZ24
我如何从渠道得到的数据频域数据?我试图直接测量通道数据之间的相关性,但我不喜欢结果。 @Kaiido –
@ NoOorZ24如果是这样的话,你也永远不会看到'dic'作为变量名或者整个C++中的std'库 – Matthias