缓存音频缓冲区以防止每次解码音频数据

时间:2020-06-01 06:05:57

标签: javascript audio buffer html5-audio

我正在处理音频文件,我在其中上载,并且每次从服务器提取音频文件时,都会在UI中表示它具有播放/暂停等功能。我正在使用持续时间为.wav / .mp3的文件大约一个小时。

我用来显示波形的库立即将整个音频文件加载到audioBuffer中,因此无法进行流传输。

我试图找到一种方法来缓存audioBuffer,以便完全跳过decodeAudioData()步骤。

我当前正在做的是使用Float32Array方法存储audioBuffer.getChannelData(0)表示形式,并转换回audioBuffer(几乎花费相同的时间)并使用localforage可以使用indexedDB进行设置和获取,但是它有其局限性,不能为大型mp3文件(1hr〜文件大小约为86-100mb)存储Float32Array

由于indexedDB无法存储audioBuffers到这样的格式,因此无法将它们存储在indexedDB中。

我需要一种跳过decodeAudioData()步骤并直接消耗audioBuffer已加载一次的文件的方法。

1 个答案:

答案 0 :(得分:0)

作为替代方案,一旦生成(或在服务器上预渲染)可视波形,则可能值得缓存。也许可以将可视化文件栅格化并在本地存储为png / jpg或从服务器发送。或者,如果是SVG,则可以保存这些元素。或者,如果是画布,则可以保存像素矩阵,这可能比解码的音频使用更少的内存。

<audio>元素擅长的一件事是流式传输和搜索。浏览器为您完成了很多繁重的工作,它们应该在性能优化之间取得平衡,而无需获取和解码整个1小时音频文件。如果您可以在使用可视组件缓存时利用本机平台功能,则可能是解决本地缓存大小限制的一种方法。