我正在尝试使用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。否则,一个简单的音频元素就足够了。