【发布时间】: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