我正在尝试使用Web Audio Api编写用于音乐的自定义Web播放器,但是在解码音频时遇到了问题。

我从后端获取.mp3作为ArrayBuffer并使用AudioContext.decodeAudioData函数对其进行解码。

  const resp = await fetch(url);
  const raw = await resp.arrayBuffer();
  const audioBuffer = context.decodeAudioData(raw);


我正在尝试将AudioBuffer缓存在IndexedDB中,但是它不是可克隆的。在带有常规mp3的设备上,解码大约需要10秒钟,而且还很长。我还有其他选择来防止歌曲之间的长时间等待(除了预取和“预解码”)吗?

最佳答案

AudioBuffer不适用于大块音频


  此接口表示驻留内存的音频资产(用于单声和其他短音频剪辑)。其格式为标称范围为-1-> +1的非交织IEEE 32位线性PCM。它可以包含一个或多个通道。通常,可以预期PCM数据的长度会很短(通常小于一分钟)。对于更长的声音(例如音乐配乐),应将流与音频元素和MediaElementAudioSourceNode一起使用。


(强调我的)

https://www.w3.org/TR/webaudio/#AudioBuffer

如果您实际上需要即时操作音频,则可能需要查看MediaElementAudioSourceNode。否则,一个简单的音频元素就足够了。

09-30 16:22
查看更多