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

okr*_*ram 8 javascript fft html5-audio web-audio-api

整个互联网上没有一个工作示例说明如何在浏览器中对声音文件/缓冲区/音频缓冲区执行 FFT 分析而不需要播放。 例如,Web 音频 API 已更改太多,无法再使用此库https://github.com/corbanbrook/dsp.js 。目前所有其他线索都无法解决问题。

编辑:我不需要操作任何数据,只需读取音频不同时刻的频谱。解决方案的输入可以是任何形式的数据(wav 文件、数组缓冲区、音频缓冲区等),但不能是流。理想情况下,预期输出将是数组(频率箱幅度)的数组(时刻)。

Ray*_*Toy 5

如果您必须使用 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.
  })
Run Code Online (Sandbox Code Playgroud)

不过,我认为只有 Chrome 支持suspend离线上下文。


Ein*_*aas 3

您可以使用离线音频上下文做很多事情,但这只会尽快运行整个节点图以渲染生成的音频块。我不知道分析器节点在这种情况下如何工作(因为它的音频输出是无用的)。

在我看来,您是正确的,因为如果不实际实时播放文件,就无法使用 Web Audio API。您必须自己进行分析,应该有很多可用的库(因为它只是数字运算)。Webworkers 或 wasm 可能是正确的选择。