在整个Internet上没有一个工作示例,涉及如何在浏览器中对声音文件/缓冲区/有效的fft分析而无需播放。Web音频API已更改过多,无法使用此库https://github.com/corbanbrook/dsp.js。目前所有其他线索都不会导致解决方案。
编辑:我不需要操纵任何数据,只是为了在音频时读取不同时刻的频谱。解决方案的输入可以是任何形式的数据(WAV文件,ArrayBuffer,AudioBuffer,任何内容),但没有流。预期的输出理想的是数组的数组(时刻)(Freqency bin振幅)。
如果您必须使用webaudio,那么这样做的方法是使用 OfflineAudioContext
。然后,当您需要获取频率数据时,请致电suspend(time)
。如下:
c = new OfflineAudioContext(....);
a = new AnalyserNode(c);
src.connect(a); // src is the signal you want to analyze.
c.suspend(t1)
.then(() => {
a.getFloatFrequencyData(array1);
})
.then(() => c.resume());
c.suspend(t2)
.then(() => {
a.getFloatFrequencyData(array2);
})
.then(() => c.resume());
// More suspends if needed
// Render everything now
c.startRendering()
.then((buffer => {
// Maybe do something now that all the frequency data is available.
})
但是,我认为只有Chrome在离线上下文中支持suspend
。
您可以使用离线AudioContext做很多事情,但这只会尽快运行整个节点图即可呈现一定的音频。我看不出分析在这种情况下甚至如何工作(因为其音频输出没有用)。
在我看来,您是正确的,因为如果不实时播放文件,就无法使用Web Audio API。您必须自己进行分析,应该有很多库可供选择(因为它只是数字弹跳)。Webworkers或WASM可能是要走的路。
您需要4件事:
-
javascript代码要在WAV文件中读取为二进制BLOB
-
代码将该斑点的切片作为16位样品转换为FFT
的数字样本的合适的JavaScript阵列 在您想要的时间和频率分辨率的DFT或合适尺寸数组的JavaScript实现您想要的
代码估算您所需的频率和幅度参数,您在数据切片上进行fft
可以从Web搜索中找到前3个
已经将API移动会为您提供大量处理的DFT输出。首先,AnalyserNode
应用Blackman-Harris窗口功能。然后应用DFT。然后进行指数平滑,其中 α
是 smoothingTimeConstant
。然后将其转换为分贝量表。这样,您只能获得幅度,而不是阶段(如果需要的话)。