javascript - 在 Node.JS 中将多个音频文件合并/合并为一个

标签 javascript node.js audio buffer concat

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




编辑:

该问题被标记为过于宽泛,因此我将其分解为一个简单的问题:

如何从网页中播放一系列音频文件(实际上是 React),而播放之间没有小间隙?

我有一个音频文件(在本例中为 mp3,但可以是任何格式),它被 Audacity 分成 100 个单独的文件。

我将这些文件作为二进制条目存储在 MongoDB 中,以便以后获取它们。 (如果解决方案基于它,文件可以整体存储在服务器上的目录中)

在带有简单 Buffet.concat() 的 Node.JS 中,我设法加入了二进制文件,并且可以将整个文件下载为单个 mp3。

问题是,输出文件只有 3 秒长(这是一个单一的 mp3 block ),但即使玩家对 3 秒的长度感到困惑,也可以在实际持续时间内播放。它也比原始完整文件大约 3MB,可能是因为 block 之间的 header 被连接起来。

我的问题是,我怎么可能将音频 block 与输出中的正确标题合并?我知道 ffmpeg 可以做一些黑魔法,但我主要需要一个缓冲区输出来使文件可以作为网页内的流播放而无需下载。这一点非常重要。

提前非常感谢:)

最佳答案

在第一种情况下,您正在获取一个音频文件和 转换 它变成许多音频文件。

在第二种情况下,您使用了许多二进制文件(是的,它们仍然是音频文件,但您使用的进程忽略了这一事实)和 连接 将它们放入一个二进制文件中。

大多数音频文件格式都包含一堆描述其内容的信息( channel 、比特率等)。使用专为处理音频文件而设计的软件,拆分音频文件,生成更多音频文件,每个文件都有自己的一组描述性数据。

尝试在不考虑其内容的情况下连接这些文件会导致单个文件包含多个音频文件的信息。由于大多数音频格式不是为这种情况而设计的,因此一些播放器只会看到第一个部分并认为其余部分是垃圾,而其他播放器会告诉您内容是一回事,而播放其他内容。

在流程的两端以相同的方式处理文件。

Javascript 没有以您想要的方式轻松操作音频的 native 方式。不过,您确实有几个选择:

  • 找到一个与音频软件接口(interface)的模块。有许多使用 ffmpeg 的 npm 模块。这样做可能仍然无法获得您想要的结果,因为合并音频文件不是一个即时过程。
  • 从页面内处理音频操作。您已经可以加载和播放单个音频文件;创建/找到可以按顺序播放它们而无需将它们拼接在一起的东西。这将允许您进行所需的操作。当用户想要下载一个成品时:将clip id的序列发送回服务器进行处理,使用上述模块将它们组装成一个音频文件,然后提供该文件供下载。
  • 关于javascript - 在 Node.JS 中将多个音频文件合并/合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53216556/

    相关文章:

    node.js - NodeJS response.send() 因大字符串而崩溃

    c++ - G.711 C++ 实现

    javascript - Soundmanager 2是否与html5音频有同样的麻烦?

    node.js - promise 运行 then() 但不返回正确的数据

    mysql - PostgreSQL 还是 MySQL 更受 Node.js 欢迎?

    android - Thread 内部的方法失去焦点

    javascript - 上一个/下一个危险的 slider 样式偷看预览

    javascript - Node JS - 通过命令行调用js文件函数

    java - 异步使用 Java applet

    javascript - Javascript 随机化数组函数