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

时间:2018-11-08 21:40:58

标签: javascript node.js audio buffer concat

编辑:

该问题被标记为范围太广,因此我将其分解为一个简单的问题:

如何播放网页中的音频文件序列(实际上是“反应”),而播放之间没有间隙?


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

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

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

问题是,输出文件只有3秒长(这是一个mp3块),但是即使播放器混淆了大约3秒的长度,它仍可以在真实时间内播放。另外,它比原始完整文件大3MB,这可能是由于块之间的标头串联在一起的缘故。

我的问题是,如何将音频块与正确的标头合并到输出中?我知道ffmpeg可以做一些魔术,但是我最需要Buffer输出,以使文件可以作为网页内的流播放而无需下载。这一点非常重要。

非常感谢:)

1 个答案:

答案 0 :(得分:0)

在第一种情况下,您要获取音频文件并将其转换为许多音频文件。

在第二种情况下,您要获取许多二进制文件(是的,它们仍然是音频文件,但是您正在使用忽略该事实的过程)并将它们串联二进制文件。

大多数音频文件格式包含一堆信息,这些信息描述了它们的内容(通道,比特率等)。使用设计用于处理音频文件的软件来分割音频文件,生成更多的音频文件,每个音频文件都具有自己的一组描述性数据。

尝试串联这些文件而不考虑其内容会导致一个文件包含多个音频文件的信息。由于大多数音频格式都不是针对这种情况而设计的,因此某些播放器只会看到第一位,而剩下的则视为垃圾,而其他播放器会告诉您内容在播放其他内容时是一回事。

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


JavaScript没有原生方法可以轻松地按您想要的方式处理音频。不过,您确实有一些选择:

  • 找到与音频软件接口的模块。有许多使用ffmpeg的npm模块。通过这种方式执行操作可能仍无法获得所需的结果,因为合并音频文件并不是一个即时过程。
  • 从页面内处理音频操作。您已经可以加载和播放单个音频文件;创建/查找可以按顺序播放而无需将它们缝合在一起的东西。这将允许您进行所需的操作。当用户要下载成品时:将片段ID序列发送回服务器进行处理,使用上述模块将它们组合成一个音频文件,然后提供该文件以供下载。