AudioBuffer 的 "getChannelData()" 相当于 MediaStream(或 MediaStreamAudioSourceNode)?

AudioBuffer's "getChannelData()" equivalent for MediaStream (or MediaStreamAudioSourceNode)?

我在 mp3 文件上使用 AudioContextdecodeAudioData,这给了我一个 AudioBuffer。使用此音频缓冲区,我继续使用 getChannelData().

返回的数据在 canvas 上绘制此 mp3 文件的波形

现在我想用同样的代码绘制一个MediaStream的音频数据的波形,也就是说我需要同样的input/data。我知道 MediaStream 包含实时信息,但必须有一种方法可以从 MediaStream 访问每个新数据,如

a Float32Array containing the PCM data

这就是 AudioBuffergetChannelData returns。

我尝试用 MediaStreamAudioSourceNode 包装 MediaStream 并将其送入 AnalyserNode 以使用 getFloatFrequencyData()(其中 returns a Float32Array),但我可以看出数据与我从 getChannelData() 获得的数据不同。也许它不是 "PCM" 数据?如何获取 "PCM" 数据?

希望这是清楚的。感谢您的帮助!

首先请注意,AnalyserNode 只是偶尔对数据进行采样,不会处理所有数据。我认为这很符合您的情况,但只要知道如果您需要所有数据(例如,您正在缓冲音频),您今天就需要使用 ScriptProcessor。

假设您只需要数据样本,您可以使用 AnalyserNode,但您应该调用 getFloatTimeDomainData(),而不是 getFloatFrequencyData()。这将为您提供 PCM 数据(FrequencyData 为您提供 PCM 数据的 FFT)。

使用音频上下文创建 MediaStreamDestination,然后从流创建新的 MediaRecorder,

var options = {mimeType: 'audio/webm;codecs=pcm'};
mediaRecorder = new MediaRecorder(stream, options);