AudioBuffer 的 "getChannelData()" 相当于 MediaStream(或 MediaStreamAudioSourceNode)?
AudioBuffer's "getChannelData()" equivalent for MediaStream (or MediaStreamAudioSourceNode)?
我在 mp3 文件上使用 AudioContext
的 decodeAudioData
,这给了我一个 AudioBuffer
。使用此音频缓冲区,我继续使用 getChannelData()
.
返回的数据在 canvas 上绘制此 mp3 文件的波形
现在我想用同样的代码绘制一个MediaStream
的音频数据的波形,也就是说我需要同样的input/data。我知道 MediaStream
包含实时信息,但必须有一种方法可以从 MediaStream
访问每个新数据,如
a Float32Array containing the PCM data
这就是 AudioBuffer
的 getChannelData
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);
我在 mp3 文件上使用 AudioContext
的 decodeAudioData
,这给了我一个 AudioBuffer
。使用此音频缓冲区,我继续使用 getChannelData()
.
现在我想用同样的代码绘制一个MediaStream
的音频数据的波形,也就是说我需要同样的input/data。我知道 MediaStream
包含实时信息,但必须有一种方法可以从 MediaStream
访问每个新数据,如
a Float32Array containing the PCM data
这就是 AudioBuffer
的 getChannelData
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);