我正在处理音频文件,我在其中上载,并且每次从服务器提取音频文件时,都会在UI中表示它具有播放/暂停等功能。我正在使用持续时间为.wav / .mp3的文件大约一个小时。
我用来显示波形的库立即将整个音频文件加载到audioBuffer
中,因此无法进行流传输。
我试图找到一种方法来缓存audioBuffer
,以便完全跳过decodeAudioData()
步骤。
我当前正在做的是使用Float32Array
方法存储audioBuffer.getChannelData(0)
表示形式,并转换回audioBuffer
(几乎花费相同的时间)并使用localforage
可以使用indexedDB进行设置和获取,但是它有其局限性,不能为大型mp3文件(1hr〜文件大小约为86-100mb)存储Float32Array
由于indexedDB无法存储audioBuffers
到这样的格式,因此无法将它们存储在indexedDB中。
我需要一种跳过decodeAudioData()
步骤并直接消耗audioBuffer
已加载一次的文件的方法。
答案 0 :(得分:0)
作为替代方案,一旦生成(或在服务器上预渲染)可视波形,则可能值得缓存。也许可以将可视化文件栅格化并在本地存储为png / jpg或从服务器发送。或者,如果是SVG,则可以保存这些元素。或者,如果是画布,则可以保存像素矩阵,这可能比解码的音频使用更少的内存。
<audio>
元素擅长的一件事是流式传输和搜索。浏览器为您完成了很多繁重的工作,它们应该在性能优化之间取得平衡,而无需获取和解码整个1小时音频文件。如果您可以在使用可视组件缓存时利用本机平台功能,则可能是解决本地缓存大小限制的一种方法。