如何在没有 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 定义为媒体元素源