如何在不需要播放的情况下对chrome中的音频文件进行FFT分析?

问题描述 投票:2回答:3

如何在浏览器中对声音文件/缓冲器/音频缓冲器进行FFT分析而不需要播放,整个互联网上没有单一的工作示例。 Web音频API已经发生了太大的变化,无法再使用这个库https://github.com/corbanbrook/dsp.js了。所有其他线索目前都无法解决问题。

编辑:我不需要操纵任何数据,只是为了在音频的不同时刻读取频谱。解决方案的输入可以是任何形式的数据(wav文件,arraybuffer,audiobuffer,任何东西),但不是流。理想情况下,预期输出将是阵列的阵列(时刻)(频率仓振幅)。

javascript fft html5-audio web-audio web-audio-api
3个回答
2
投票

您可以使用离线audiocontext做很多事情,但这样可以尽可能快地运行整个节点图形来呈现生成的音频块。我没有看到分析器节点如何在这种情况下工作(因为它的音频输出是无用的)。

在我看来你是正确的,因为你不能在没有实时播放文件的情况下使用Web Audio API。你必须自己做分析,应该有很多可用的库(因为它只是数字计算)。网络工作者或者主义者可能是要走的路。


1
投票

你需要4件事:

  • 用于在WAV文件中读取二进制blob的Javascript代码
  • 将该blob的切片作为16位样本转换为FFT的数值样本的合适Javascript数组的代码
  • 适合您需要的时间和频率分辨率的适当大小数组的DFT或FFT的Javascript实现
  • 在数据切片中逐步重复FFT时,用于估算所需频率和幅度参数的代码

前3个可以从网络搜索中找到(Github,这里,et.al。)


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

© www.soinside.com 2019 - 2024. All rights reserved.