如何在没有 Web Audio API 的情况下直接从 ArrayBuffer 获取通道数据?

Posted

技术标签:

【中文标题】如何在没有 Web Audio API 的情况下直接从 ArrayBuffer 获取通道数据?【英文标题】:How to get channel data directly from ArrayBuffer without Web Audio API? 【发布时间】:2019-09-27 14:32:46 【问题描述】:

在我的 Web 应用程序中,我使用 html5 Audio 进行音频播放。但是因为我需要音频文件的channelData,所以在应用启动时需要做如下步骤:

    使用 Web Audio API 将 ArrayBuffer 解码为 AudioBuffer 调用audioBuffer.getChannelData(0) 处理 channelData 并转储 audioBuffer 使用 channelData 我可以将音频信号绘制到画布上

有什么方法可以从原始数据(ArrayBuffer)计算channelData?我的应用程序仅支持 PCM 16 位的 WAVE。

我知道 WAVE 格式的结构以及如何通过 javascript 从原始数据中读取值,但我不明白 getChannelData() 如何计算其值。我在网上一无所获。

【问题讨论】:

【参考方案1】:

getChannelData 没有什么神奇之处;它只是从AudioBuffer 返回数据。如果您有一个 16 位 PCM WAV 文件,您可以轻松地将其解码为 Javascript 中的 16 位 PCM 值。要得到getChannelData 会产生的结果,请取该 16 位值并除以 32768 以获得介于 -1 和 1 之间的浮点值。

【讨论】:

非常感谢!我对其进行了测试,比较时得到的值略有不同:例如:示例 1:来自原始:0.00341796875 来自 Web API:0.0033789610024541616 示例 2:来自原始:0.005035400390625 来自 Web API:0.005054975859820843 等等。你知道为什么值不相等吗?和浏览器的采样率有关系吗? 有可能。如果 WAV 文件的采样率与上下文相同,那么它们应该匹配。如果速率不同decodeAudioData 将重新采样音频文件以匹配上下文采样率。哦,最后一件事,可能是正 PCM 值除以 32767,负值除以 32768,因为 16 位值介于 -32768 和 32767 之间。

以上是关于如何在没有 Web Audio API 的情况下直接从 ArrayBuffer 获取通道数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Web Audio API 中将 SoundManager2 定义为媒体元素源

如何在 Web Audio API 中更改音频缓冲源的时间?

Web Audio API 如何命名声音

在 Web Audio API 中导出音频强度

Web Audio API:防止麦克风输入通过扬声器播放

如何下载我刚刚使用 Web Audio API 创建的声音?