Concat/join 多个音频文件合二为一 Node.JS
Concat/join multiple audio files into one in Node.JS
编辑:
该问题被标记为过于宽泛,因此我将其分解为一个简单的问题:
如何从网页中播放一系列音频文件(实际上是 React),播放之间没有小间隙?
我有一个音频文件(在本例中为 mp3,但可以是任何格式)被 Audacity 拆分为 100 个单独的文件。
我将这些文件作为二进制条目存储在 MongoDB 中,以便稍后获取它们。 (如果解决方案基于它,文件可以作为一个整体存储在服务器上的一个目录中)
在 Node.JS 中,使用简单的 Buffet.concat(),我设法加入了二进制文件,我可以将整个文件下载为单个 mp3。
问题是,输出文件只有 3 秒长(这是一个单独的 mp3 块),但即使播放器对 3 秒的长度感到困惑,也可以在实际持续时间内播放。它也比原始完整文件大 ~3MB,可能是因为 headers 块之间被连接起来。
我的问题是,我怎么可能将音频块与正确的 headers 合并到输出中?我知道 ffmpeg 可以做一些黑魔法,但我主要需要一个缓冲区输出来使文件可以在网页内作为流播放而无需下载。这点很重要。
提前致谢:)
在第一种情况下,您正在获取一个音频文件并将其转换成许多音频文件。
在第二种情况下,您获取了许多二进制文件(是的,它们仍然是音频文件,但您使用的过程忽略了这一事实)并且连接 将它们合并到一个二进制文件中。
大多数音频文件格式都包含大量描述其内容的信息(声道、比特率等)。使用专为处理音频文件而设计的软件来拆分音频文件,生成更多音频文件,每个文件都有自己的一组描述性数据。
在不考虑文件内容的情况下尝试连接这些文件会导致单个文件包含多个音频文件的信息。由于大多数音频格式都不是为这种情况设计的,一些玩家只会看到第一位并认为其余的都是垃圾,而其他玩家会告诉你内容是一回事,而在玩其他东西。
在流程的两端以相同的方式处理文件。
Javascript 没有以您想要的方式轻松操纵音频的本机方法。不过,您确实有几个选择:
- 找到一个与音频软件接口的模块。有许多使用 ffmpeg 的 npm 模块。这样做可能仍然无法获得您想要的结果,因为合并音频文件不是一个即时过程。
- 从页面内处理音频操作。您已经可以加载和播放单个音频文件; create/find 可以按顺序播放它们而无需将它们拼接在一起的东西。这将允许你想要的那种操作。当用户想要下载成品时:将剪辑id序列传回服务器进行处理,使用上述模块将它们assemble成一个音频文件,然后提供该文件供下载。
编辑:
该问题被标记为过于宽泛,因此我将其分解为一个简单的问题:
如何从网页中播放一系列音频文件(实际上是 React),播放之间没有小间隙?
我有一个音频文件(在本例中为 mp3,但可以是任何格式)被 Audacity 拆分为 100 个单独的文件。
我将这些文件作为二进制条目存储在 MongoDB 中,以便稍后获取它们。 (如果解决方案基于它,文件可以作为一个整体存储在服务器上的一个目录中)
在 Node.JS 中,使用简单的 Buffet.concat(),我设法加入了二进制文件,我可以将整个文件下载为单个 mp3。
问题是,输出文件只有 3 秒长(这是一个单独的 mp3 块),但即使播放器对 3 秒的长度感到困惑,也可以在实际持续时间内播放。它也比原始完整文件大 ~3MB,可能是因为 headers 块之间被连接起来。
我的问题是,我怎么可能将音频块与正确的 headers 合并到输出中?我知道 ffmpeg 可以做一些黑魔法,但我主要需要一个缓冲区输出来使文件可以在网页内作为流播放而无需下载。这点很重要。
提前致谢:)
在第一种情况下,您正在获取一个音频文件并将其转换成许多音频文件。
在第二种情况下,您获取了许多二进制文件(是的,它们仍然是音频文件,但您使用的过程忽略了这一事实)并且连接 将它们合并到一个二进制文件中。
大多数音频文件格式都包含大量描述其内容的信息(声道、比特率等)。使用专为处理音频文件而设计的软件来拆分音频文件,生成更多音频文件,每个文件都有自己的一组描述性数据。
在不考虑文件内容的情况下尝试连接这些文件会导致单个文件包含多个音频文件的信息。由于大多数音频格式都不是为这种情况设计的,一些玩家只会看到第一位并认为其余的都是垃圾,而其他玩家会告诉你内容是一回事,而在玩其他东西。
在流程的两端以相同的方式处理文件。
Javascript 没有以您想要的方式轻松操纵音频的本机方法。不过,您确实有几个选择:
- 找到一个与音频软件接口的模块。有许多使用 ffmpeg 的 npm 模块。这样做可能仍然无法获得您想要的结果,因为合并音频文件不是一个即时过程。
- 从页面内处理音频操作。您已经可以加载和播放单个音频文件; create/find 可以按顺序播放它们而无需将它们拼接在一起的东西。这将允许你想要的那种操作。当用户想要下载成品时:将剪辑id序列传回服务器进行处理,使用上述模块将它们assemble成一个音频文件,然后提供该文件供下载。