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

标签 javascript audio buffer html5-audio

我正在处理我上传的音频文件,每次从服务器获取音频文件时,它都会在 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/

相关文章:

c - 堆栈溢出损坏 %ebp

javascript - VueJs : How to pass a 'computed function' value from child component to the parent component using $emit(optionalPayload) and $on?

javascript - 如何在 Angular View 中动态构造范围变量?

javascript - JQuery 按钮禁用整个网站的 CSS?

C# FMOD 从流中播放

javascript - 正在卸载预加载的声音?

audio - 计算 A 加权(或 B 或 C)声压级分贝 iOS

Javascript:单击后更改按钮文本。 event.target 不起作用

c - scanf 什么时候开始和停止扫描?

vim - 比较 Vim 中的两个选项卡