javascript - 在Javascript中压缩音频缓冲区大小
问题描述
我的主要目标是使用 JavaScript 压缩音频文件以减小其大小。但棘手的部分是我应该为我的用例抱怨的所有限制和要求:
- 我可以使用 Web Audio API(或基于它的库)压缩音频文件吗?
- 理想情况下,我的代码应该在浏览器和 NodeJS 中运行。对于 Node,我已经在使用 Web 音频 API,我依赖于一个库 - https://www.npmjs.com/package/web-audio-api提供支持;因此,理想情况下,我也应该能够轻松地调整您为 Node 中的浏览器 JS 提出的解决方案。
- 对于 Node,我不想使用 ffmpeg 或任何衍生产品,因为它们依赖本机二进制文件来运行,当我尝试部署到 Google Cloud 函数和 Azure Functions 时,这会使运行时复杂化。
- 目前,我将音频内容作为AudioBuffer,因此理想情况下,该解决方案应该能够处理此类数据结构并且不需要文件系统交互。
在我看来,基于 Web Audio API AudioBuffer 的库或用于减少数据大小的算法将是最好的解决方案,因为即使它与用于音频的 NodeJS 库不兼容,希望我能够修补它以便它可以工作我的用例。
解决方案
我找到了一个音频编码器 javascript 库,它可以在节点和浏览器中运行,名为lamejs
.
所以我需要实现的可以如下完成:
const mp3encoder = new lamejs.Mp3Encoder(1, SAMPLE_RATE, KBPS);
let samples = audioBuffer.getChannelData(0).map(x => x * 32767.5);
const encoded = mp3encoder.encodeBuffer(samples);
mp3Data.push(encoded);
mp3Data.push(mp3encoder.flush());
请注意,您需要标准化音频音量,因为在典型的 AudioBuffer 中,数据存储为 0 和 1 之间的浮点数,这就是为什么在读取通道数据时应将其乘以 32767.5 以兼容lamejs
;
推荐阅读
- f# - 如何在 F# 中按人口加权收入?
- spring-cloud-stream - 记录源应用程序错误通道的 Spring Sleuth Span Id
- ros - 将 .xacro 加载到 .xacro 中没有可见的效果
- python - HTTP 错误:403,带有美丽汤的 Python
- amazon-web-services - 在 AWS Lambda 上运行 Jest
- scripting - 如何将列中的值从 StarBasic 返回到 Calc
- c# - 打开 XML 格式不起作用
- r - 使用 R 中的列表创建数据框名称
- excel - 日期之后的 COUNTIF/MATCH
- perl - 如何打印打包函数的结果?