AudioContext 的频率数据与 OfflineAudioContext 的频率数据差异很大

AudioContext's frequency data differs greatly from OfflineAudioContext's frequency data

标题基本上说明了我的问题。我一直在比较使用在线和离线音频上下文捕获的频率数据。它们似乎有很大的不同,所以我把这个 MWE 放在一起来显示差异。

基本上只要上传任何音频文件,OfflineAudioContext 就会立即拾取并开始渲染。每当渲染达到歌曲的播放秒数 5 时,它就会输出当前的频率数据。 OfflineAudioContext 完全完成渲染后,您会看到页面上的音频控件得到更新,您可以播放歌曲。一旦歌曲达到 5 秒,使用在线 AudioContext,分析仪的频率数据将输出到屏幕。

您将能够看到两者之间的频率数据,至少对于我一直投入的歌曲而言,差异很大。不确定我是否没有完全理解 OfflineAudioContext 或者它是什么,但是如果有人 运行 有类似的东西或者对这里发生的事情有任何想法,我将不胜感激你能提供的任何信息.

假设您的测试文件是某种音乐文件,那么我希望结果会有所不同。除非你能同时调用getByteFrequencyData,否则你会得到不同的结果,因为AnalyserNode中的数据会不同。由于 getByteFrequencyData 是从主线程调用的,并且必须从音频线程获取数据,因此很难确切知道您拥有什么数据。

如果你必须为离线上下文和实时上下文获取相同的数据,你应该使用ScriptProcessorNodeAudioWorkletNode来保证你同时获取频率数据。 (但要保持一致;在两种情况下都使用 ScriptProcessorNodeAudioWorkletNode。)

如果有人遇到同样的事情,我终于弄清楚问题出在哪里了。每当我创建 OfflineAudioContext 时,我都会错误地初始化它。我在做这个

let offline = new OfflineAudioContext(2, 44100 * buffer.duration, 44100);

当我应该做的时候

let offline = new OfflineAudioContext(buffer.numberOfChannels, buffer.length, buffer.sampleRate);

在我进行更改后,离线上下文和实时上下文之间的频率数据值看起来更接近了。