2017-09-20 186 views
1

我正在尝试使用Web Audio Api为音乐编写自定义网络播放器,但是我遇到了解码音频的问题。AudioBuffer无法缓存/ decodeAudioData需要很长时间

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

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

我试图缓存AudioBuffer在IndexedDB的,但它不是可克隆。我的设备上的解码需要大约10秒钟的时间,而且这个时间很长。除了预取和“预解码”之外,我还有其他选择来防止歌曲之间漫长的等待时间吗?

+0

难道您不能将数据作为流获取并将其解码为部分? – Nit

+0

在部分解码它似乎相当复杂,因为javascript时钟非常不准确。我试过了,但我无法阻止音频片断之间的crack ling声。此外,该文件说:。 “异步解码包含在ArrayBuffer音频文件数据在这种情况下,ArrayBuffer通常是从一个XMLHttpRequest的响应属性加载设置的responseType到arraybuffer后,此方法仅适用于完整的文件,而不是碎片音频文件“。 https://developer.mozilla.org/de/docs/Web/API/AudioContext – Lucas

回答

4

AudioBuffer并不意味着大块音频

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

(重点煤矿)

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

你可能要考虑MediaElementAudioSourceNode如果你确实需要操作上飞的声音。否则,一个简单的音频元素就足够了。

+0

哦该死的,所以我完全滥用decodeAudioBuffer方法。感谢您的澄清,我会尝试使用html元素来实现播放器。 – Lucas