如何在Chrome中对音频文件进行FFT分析而无需播放



在整个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。然后将其转换为分贝量表。这样,您只能获得幅度,而不是阶段(如果需要的话)。

最新更新