【问题标题】:AudioBuffer's "getChannelData()" equivalent for MediaStream (or MediaStreamAudioSourceNode)?AudioBuffer 的“getChannelData()”等效于 MediaStream(或 MediaStreamAudioSourceNode)?
【发布时间】:2017-03-11 21:35:39
【问题描述】:

我在一个 mp3 文件上使用AudioContextdecodeAudioData,这给了我一个AudioBuffer。有了这个音频缓冲区,我继续使用getChannelData() 返回的数据在画布上绘制这个 mp3 文件的波形。

现在我想使用相同的代码来绘制MediaStream 的音频数据的波形,这意味着我需要相同类型的输入/数据。我知道MediaStream 包含实时信息,但必须有一种方法可以从MediaStream 访问每个新数据

包含 PCM 数据的 Float32Array

这是AudioBuffergetChannelData 返回的内容。

我尝试用MediaStreamAudioSourceNode 包装MediaStream 并将其输入AnalyserNode 以使用getFloatFrequencyData()(返回Float32Array),但我可以看出数据与我的数据不同从getChannelData() 获取。也许它不是“PCM”数据?如何获取“PCM”数据?

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

【问题讨论】:

    标签: audio-recording web-audio-api audiocontext mediastream


    【解决方案1】:

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

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

    【讨论】:

    • getFloatTimeDomainData() 似乎没有返回与getChannelData() 相同的数据,因为我使用getFloatTimeDomainData() 在画布上绘制波形的结果不好。您确定两个数组代表相同的数据并且以相同的方式组织吗?
    • 如果 MediaStream 有多个通道(比如立体声),AnalyserNode 会将它们混合为单声道。您需要拆分 MediaStream 数据(使用ChannelSplitterNode 来获取您想要的曲目并将其发送到分析仪。
    • @RaymondToy 谢谢雷蒙德,这救了我!!您可以将其发布为答案吗?或者 cwilso,您能否更新您的答案以包含此附加信息?
    • 很高兴为您工作!我认为这不是对您问题的有效答案。 cwilso 有您问题的正确答案。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-29
      • 2021-03-15
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      相关资源
      最近更新 更多