我正在处理我上传的音频文件,每次从服务器获取音频文件时,它都会在 UI 中表示,具有播放/暂停等功能。我正在处理持续时间接近的 .wav/.mp3 文件一小时。
我用于显示波形的库一次将整个音频文件加载到 audioBuffer
中。所以流媒体是不可能的。
我正在尝试找到一种方法来缓存 audioBuffer
为了跳过decodeAudioData()
完全迈出一步。
我目前正在做的是存储 Float32Array
使用 audioBuffer.getChannelData(0)
表示方法并转换回 audioBuffer
(几乎花费相同的时间)并使用 localforage
使用 indexedDB 来设置和获取,但它有它的局限性,不能存储 Float32Array
适用于大型 mp3 文件(1hr ~ 文件大小约为 86-100mb)
我不能直接存储 audioBuffers
由于 indexedDB 不兼容存储此类格式,因此在 indexedDB 中。
我需要一种方法来跳过 decodeAudioData()
步骤并直接使用 audioBuffer
已经加载过一次的文件。
最佳答案
作为替代方案,一旦生成可视波形(或在服务器上预渲染),缓存可视波形可能是值得的。也许可视化可以光栅化并在本地存储为 png/jpg 或从服务器发送。或者,如果它是 SVG,则可以保存这些元素。或者如果它是 Canvas ,也许可以保存像素矩阵,这可能会比解码音频使用更少的内存。
一件事<audio>
元素的好处是流式传输和搜索。浏览器为您做了很多繁重的工作,并且应该平衡性能优化,而无需获取和解码整个 1 小时的音频文件。如果您可以在使用可视组件缓存的同时利用 native 平台功能,这可能是一种绕过本地缓存大小限制的方法。
关于javascript - 缓存音频缓冲区以防止每次解码音频数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62126552/