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

Javascript 如何在chrome中对音频文件进行FFT分析而无需播放?,javascript,fft,html5-audio,web-audio-api,Javascript,Fft,Html5 Audio,Web Audio Api,在整个互联网上,没有一个工作示例说明如何在浏览器中对声音文件/缓冲区/音频缓冲区执行FFT分析而无需回放。例如,Web音频API已更改过多,无法再使用此库。所有其他线索目前都无法找到解决方案 编辑: 我不需要操纵任何数据,只需要读取音频中不同时刻的频谱。解决方案的输入可以是任何形式的数据(wav文件、arraybuffer、audiobuffer、任何东西),但不能是流。理想情况下,期望的输出是阵列(时间矩)的阵列(频率单元振幅)。您可以使用脱机audiocontext做很多事情,但这将尽可能快

在整个互联网上,没有一个工作示例说明如何在浏览器中对声音文件/缓冲区/音频缓冲区执行FFT分析而无需回放。例如,Web音频API已更改过多,无法再使用此库。所有其他线索目前都无法找到解决方案

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

您可以使用脱机audiocontext做很多事情,但这将尽可能快地运行整个节点图,以渲染生成的音频块。我不知道AnalyzerNode在这种情况下是如何工作的(因为它的音频输出是无用的)

在我看来,你是正确的,你不能使用Web音频API而不实时播放文件。您必须自己进行分析,应该有很多库可供使用(因为它只是数字运行)。Webworkers或wasm可能是最好的选择。

您需要4件事:

  • 将WAV文件作为二进制blob读取的Javascript代码

  • 代码,用于将blob的切片作为16位样本转换为适合FFT的数字样本的Javascript数组

  • DFT或FFT的Javascript实现,其数组大小适合所需的时间和频率分辨率

  • 代码,用于在跨数据片步进和重复FFT时估计所需的频率和幅值参数


前3个可以从web搜索(Github,here,et.al.)中找到。

如果必须使用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支持离线环境下的挂起。

您是在测量(采样)实际音频输出还是原始数据?这个问题需要分析。文件是静态的;在没有用户操作的情况下不会更改数据。分析的目的是对实际音频输出进行采样,也就是说,音频输出预期不同,或者至少,采样记录预期是唯一的,或者对于每个媒体播放来说是任意的,正确的原始数据。由于更快的用户体验,我需要避免输出。原始数据(一个没有被回放的静态文件)是为了什么而分析的?“不需要播放”是什么意思?要求和预期的输入和输出是什么?在播放某个文件之前,您是在尝试操作该文件以过滤某些音频输出,还是必须播放媒体才能执行过滤?好的,您是对的。如果不使用C-accelerated webaudiio api的工具,尝试在纯userland js中装载和分析波形,实际上会比较慢。我甚至不知道你怎么能把mp3变成一种音乐。如果您确实使用了所有的js,请使用webworkers来避免ui减速。@okram-See;我只能找到“web音频API的瘦包装器”库。你们对我的问题有并没有文档化的解决方案的库有什么个人建议?我并没有你们想要做什么的经验,但频率分析只是通过数字进行的,不是很模糊,所以js中应该有大量的现有代码。不过,你不应该搜索任何与web audio api相关的内容——我们都认为它可能不适用于此:)谢谢,了解这个选项很有意思。不幸的是,我需要使用跨浏览器功能,Firefox和Safari目前不支持脱机上下文上的挂起方法,这太糟糕了。我确实针对Firefox提交了一个关于添加这个的bug。你可以为Safari提交一个bug。也许有一天它会得到实施。这是第三点,这就是问题所在。您是否知道FFT的JS实现在浏览器中实际工作?因为确实如此,所以它变得非常简单(见鬼,甚至可以使用带有AudioContext.decodeAudioData()的mp3文件,因为如果我们要使用纯JS而不是音频API,就不需要庞大的PCM波形文件)