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

时间:2019-09-30 01:15:24

标签: javascript web-audio-api

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

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

您将能够看到两者之间的频率数据变化很大,至少对于我一直在扔的歌曲而言。不知道我是不是完全了解OfflineAudioContext还是它是什么,但是如果有人遇到类似的情况或对这里发生的事情有任何想法,我将不胜感激。 >

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果有人遇到同样的问题,我最终弄清楚了问题所在。每当创建OfflineAudioContext时,我都会错误地对其进行初始化。我正在这样做

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

我应该做的时候

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

进行此更改后,脱机上下文和实时上下文之间的频率数据值显得更接近。