首页 > 解决方案 > 为流媒体服务器正确拆分 MPEG-1 第 3 层

问题描述

我正在开发音乐流媒体服务器。现在我想将 MP3 文件分块从服务器发送到客户端(通过 http-range 请求/响应)。我的客户端成功解码响应数据并在块(固定字节大小)之后播放音乐块,但在每个块之间有一个结巴的声音(短但明显)。

MP3 文件的编码版本是 MPEG-1 和第 3 层。我在本文中阅读了有关 MP3 格式的信息,我注意到第 3 层中的帧不是独立的(称为位/字节存储库),他们特别说:

在最坏的情况下,可能需要 9 个输入帧才能解码单个帧

我使用 http-range 请求的原因是因为在检查了Spotify网络传输(Chrome 开发工具)之后,我复制了他们请求部分内容的技术。他们请求的字节长度大约是 166000,但不是固定的(有时是 166287、16682...字节)

问题:

Spotify是否将其文件拆分为近似(非固定)大小的块?

如果是这样,我如何正确拆分此 MPEG-1 第 3 层文件以进行流式传输?

标签: javascriptmp3audio-streamingmpeg

解决方案


现在,我在客户端使用 javascript 来播放音频。我使用“AudioContext”类和“decodeAudioData”方法来解码每个块

正如@szatmary 指出的那样,这就是问题所在。您将这些块视为完全独立,但事实并非如此。这会导致故障发生。

您需要做的是随时解码,并将数据添加到您正在解码的缓冲区的末尾。 MediaSource Extensions是执行此操作的规定方式。MSE 让您可以控制如何获取该数据,因此如果您想通过 Range 请求获取它,您可以。

我认为更好的建议是让浏览器处理它。只需设置srcAudio 元素的属性并让它播放。浏览器足够智能,可以发出自己的范围请求,如果需要,也会回退到常规请求。这允许浏览器也处理流控制。你不需要做任何额外的工作,你最终会得到一个更优化的解决方案。


推荐阅读