5

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

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

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

我已经想通了: - 我可以让服务器知道 MP3 帧以避免同步错误。- 我正在考虑在流中的 MP3 帧之后附加广告文件中的 MP3 帧。- 由于广告是从正确编码的 MP3 文件加载的,我绕过了字节库的问题,因为文件的第一帧不能使用它。

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

您是否知道任何可以无缝连接两个 MP3 文件而无需解压缩的库/工具(如果可能的话是开源的)?

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

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

PS。这个问题与合并 mp3 文件的最佳方法是什么?. mp3wrap 和类似的工具对我来说不是一个选择。

4

5 回答 5

2

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

这就是为什么很难确定一个 mp3 文件的时长的原因之一。

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

问题是某些 MP3 播放器可能很严格,并且需要 VBR MP3 文件的 Xing 标头。然而,这从来都不是 MP3 格式的规范,但现在假定它是正确的。

于 2009-12-03T17:04:26.207 回答
2

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

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

于 2009-05-17T20:37:24.683 回答
0

如果您使用的是 Windows,Microsoft DirectShow API 可能是您的首选。您应该会发现它能够以各种格式处理静态和流式音频和视频(您只需要必要的编解码器,并且界面几乎对所有人都相同)。

话虽如此,但不幸的是,DirectShow 的设计非常复杂,学习曲线陡峭,但如果您要在 Windows 上进行音频/视频操作,它提供的功能无与伦比。然而,有大量关于如何使用它的示例和教程,所以最终可能不会那么痛苦。此外,如果您使用的是 .NET Framework,则有一个名为DirectShow.NET的托管包装。无论你做什么,这都不是一件容易的事,除非那里有我不知道的东西。无论如何,祝你好运!

于 2009-05-17T20:37:20.737 回答
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

于 2009-05-17T20:54:40.400 回答
-2

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

于 2009-05-17T20:56:45.200 回答