如何无缝连接MP3流?

时间:2009-05-17 20:26:50

标签: streaming mp3 lossless

我正在开发能够播放目标广告的流媒体服务器。基本上听众听到相同的音乐,但每个,比方说,30分钟就会出现一块广告,每个听众都有自己的音乐。实现这样的流服务器会带来各种问题,而这个问题就是其中之一。

服务器将以类似于Icecast的方式工作,即它将从某个流生成器通过网络读取流并将其转发给每个侦听器。当广播广告时,服务器停止从生成器获取流,从文件中读取广告并将它们插入每个侦听器的缓冲区,传输它们并从生成器中继流中继续。

当服务器从中继流切换到广播广告时,它必须连接两个MP3流(我们用MP3播放)。我担心的是,简单地追加一个接一个的数据可能会产生一些可听到的伪像。可以无缝完成吗?

我已经弄明白了:   - 我可以让服务器知道MP3帧,以避免同步错误。   - 我正在考虑在流中的MP3帧之后从广告文件中添加MP3帧。   - 由于广告是从正确编码的MP3文件中加载的,因此我避免了字节存储的问题,因为文件的第一帧无法使用它。

但我担心的是MDCT的工作方式。听众不知道我的服务器会做什么,因此他们的MP3解码器可能会产生一些工件,因为不正确的MDCT数据会在他们下载的流中一个接一个地放置。广告文件开头的零填充是否会对此进行补偿?

你知道哪些库/工具(如果可能的话是开源的)可以无缝地连接两个MP3文件而不解压缩它们?

你能指出任何描述MP3格式的好资源吗?我搜索了很多网,找到了很多信息,但我仍然想念整体情况。

也许您知道如果我使用其他编解码器(如OGG / Vorbis,AAC)会更容易吗?

PS。此问题与What is the best way to merge mp3 files?不重复。 mp3wrap和工具都不适合我。

5 个答案:

答案 0 :(得分:2)

我相信MP3可以通过简单地连接文件来合并。在一些快速测试(cat file1.mp3 file2.mp3 > merged.mp3; mplayer merged.mp3)中,它似乎按预期工作。从Web服务器流式传输可能也会起作用。

您将如何处理切换当前输入文件?您可以简单地将广告视为可播放的短曲目。

答案 1 :(得分:2)

您应该能够连接CBR和VBR格式的mp3文件。 MP3文件没有主标题(忽略ID3和Xing)。音频数据存储为块,其中每个块包括其自己的头部。标题包含用于解码该块中音频数据的必要信息(比特率,采样频率,立体声等)。

这是难以确定mp3文件持续时间的原因之一。

另一种看待它的方法是,如果将CBR MP3文件与VBR文件连接起来,最终结果与一个长VBR文件相同,其中第一部分音频以恒定比特率。

问题是一些MP3播放器可能很严格,并期望一个VBR MP3文件的Xing标题。然而,这从来都不是MP3格式的规格,但现在假设它是真的。

答案 2 :(得分:0)

如果您使用的是Windows,则可能需要使用Microsoft DirectShow API。您应该发现能够以各种格式静态和流式传输音频和视频(您只需要必要的编解码器,并且所有接口的界面几乎相同)。

说到这一点,不幸的是,DirectShow以一种非常错综复杂的方式设计,并且具有陡峭的学习曲线,但如果你要在Windows上进行音频/视频操作,那么它提供的功能是无与伦比的。然而,有大量的样本和教程如何使用它,所以最终可能不会那么痛苦。此外,如果您使用的是.NET Framework,则会有一个由DirectShow.NET名称包含的托管。无论你做什么,这都不是一件容易的事,除非有什么东西比我不知道。祝你好运!

答案 3 :(得分:0)

我找到了一个非常类似的问题,在各种渠道提出正确的问题之后,提出了以下问题......

任何有价值的解码器都会跳过“坏”数据,直到它遇到有效的帧头。这就是ID3v2依赖于将额外信息注入mp3数据的内容。在服务器上,我会分析源MP3文件,只提供有效的MP3帧。如果您提供一些静音帧(大约7个应该这样做),解码器应该有时间解决,然后再加载下一个(无关联的)MP3数据负载,避免在连接不同编码的帧时(正确)假设的假象会话。

更有问题的是在一帧到下一帧之间可能切换MP3属性(1/2通道,输出采样率等)。一些解码器在面对这样的流时变得非常不安,导致1/2速度回放等。因此,您需要确保所有源材料都编码为相同的输出属性,否则您可能会被解开。

您可能已经看过这个,但如果没有:

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=79&printer=t

答案 4 :(得分:0)

我不明白你为什么要连接这些文件。为什么不使用某种播放列表系统,只需更改发送的文件。从长远来看,我认为这样可以提供更大的灵活性,而且你最终不会得到大型的MP3文件。