【问题标题】:Concat/join multiple audio files into one in Node.JS [closed]在Node.JS中将多个音频文件合并/合并为一个[关闭]
【发布时间】:2018-11-08 21:40:58
【问题描述】:

编辑:

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

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


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

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

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

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

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

提前非常感谢:)

【问题讨论】:

  • MP3 是一种压缩的音频格式,每个单独的文件都有自己的标题和自包含的数据。您不能只是将字节连接在一起并期望它起作用;您必须先将 MP3 解码为原始音频数据,然后连接音频缓冲区。
  • 另外,将分割的音频文件存储在数据库中似乎是一个非常糟糕的主意。它应该只托管在您的服务器上,然后通过<audio> 标签加载并使用Web Audio API 播放。
  • @Herohtar 因为我需要在“时间轴”上重新排列它们,并让用户将整个声音作为一个单独的声音播放,但按用户放置它们的顺序组织块
  • 啊,我明白了。您是否尝试过使用AudioBuffer 进行连接?您应该能够使用它来组合一些东西,因为 Web Audio API 正是针对这些场景而设计的。要么将它们连接在一起,要么连续播放每个缓冲区。
  • @Herohtar,实际上我更深入地挖掘并编写了更好的代码版本,它就像一个魅力,缓冲区之间似乎没有延迟。非常感谢您的提示!

标签: javascript node.js audio buffer concat


【解决方案1】:

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

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

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

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

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


Javascript 没有以您想要的方式轻松处理音频的本机方式。不过,您确实有几个选择:

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

【讨论】:

  • 第二个选项是我想要实现的,但是对于普通的 HTML5 音频类,似乎不可能在块之间没有间隙的情况下播放序列。正如 Herohtar 所提到的,也许 AudioBuffer 是要走的路,但我正在努力处理文档。
  • @IgorVANIAN 似乎 AudioBuffer 对待音频很像 canvas 对待图形。您可以创建缓冲区数组,可以是空白的,也可以从源材料中创建,然后使用基本的for 循环复制块。 developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/… 给出了一个将静态添加到加载的音频文件的示例,但更改它似乎是可行的,以便播放的音频从零缓冲区开始,并根据需要复制数据库中的音频块。
  • @Outoborus,我在 AudioBuffer API 上苦苦挣扎,但最后那是正确的工具。我现在可以很容易地播放缓冲区之间没有间隙的序列了!谢谢你的提示。您可能想将此添加到您的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2011-06-14
  • 2015-06-22
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多