在整个互联网上,没有一个可行的示例可以说明如何在浏览器中无需回放就对声音文件/缓冲区/音频缓冲区进行FFT分析。例如,Web音频API进行了太多更改,无法再使用此库https://github.com/corbanbrook/dsp.js。所有其他线索目前都无法解决。
编辑: 我不需要处理任何数据,只需要在音频的不同时刻读取频谱即可。解决方案的输入可以是任何形式的数据(wav文件,arraybuffer,audiobuffer等),但不能是流。理想情况下,预期输出将是阵列(频率仓幅度)的阵列(时间矩)。
答案 0 :(得分:2)
您可以使用脱机音频上下文执行很多操作,但这将尽可能快地运行整个节点图以呈现最终的音频块。我看不到分析器节点在这种情况下甚至不会工作(因为其音频输出无用)。
我认为您是正确的,因为您必须在不实时播放文件的情况下才能使用Web Audio API。您必须自己进行分析,应该有很多可用的库(因为它只是数字处理)。 Webworkers或wasm可能是要走的路。
答案 1 :(得分:1)
您需要4件事:
以WAV文件形式读取二进制blob的Javascript代码
代码,将该blob的切片作为16位样本转换为适用于FFT的数字样本的Javascript数组
DFT或FFT的Java语言实现,可实现所需大小的时间和频率分辨率
代码,用于在数据切片中逐步重复执行FFT时估算所需的频率和幅值参数
可以从网络搜索中找到前3个(Github,此处等)
答案 2 :(得分:1)
如果必须使用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
且具有离线上下文。