【问题标题】:How do I seamlessly concatenate MP3 streams?如何无缝连接 MP3 流?
【发布时间】:2010-10-26 21:37:35
【问题描述】:

我正在开发一个能够广播定向广告的流媒体服务器。基本上听众会听到相同的音乐,但是每隔 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 和类似的工具不适合我。

【问题讨论】:

    标签: streaming mp3 lossless


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这就是我想要的方式,但你确定它有效并且不会产生声音故障吗?
    • 最有可能这行不通...有多种 mp3 格式...您可以设置一个恒定比特率的 mp3 和一些恒定的帧大小(每个样本有很多位),或者波动的可变比特率 mp3……它们不兼容。同样简单的连接会将标头和 id3 标签放在文件的中间,因此媒体文件在播放文件时会出现问题。如果您想以正确的方式执行此操作,您将需要使用执行此操作的软件,或者将两个审计文件转换为单一格式,然后连接音频流并保存在新文件中。
    • 假设我没有任何 ID3 标签并且我使用恒定比特率。
    • 如果您的 mp3 具有相同的恒定比特率和采样速度 (khz),那么上述内容应该适用于连接文件。正如其他人提到的,这些标签在媒体播放器中不起作用,但应该被跳过。
    • 我不能保证“没有任何情况”——可能有音频播放器对连接的 MP3 反应不佳。但是,它应该适用于大多数情况。如果您担心,请尝试我在一些本地文件上发布的命令,看看它是否有效。
    【解决方案2】:

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

    这也是很难确定一个 mp3 文件时长的原因之一。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这样的 API 在计算上可能过于昂贵。我工作的广播电台已经有 5k 用户/服务器峰值流量。即使我只需要为每个听众处理一秒钟的音乐,也需要一个多小时的音乐来立即解压/压缩......
      • 我不确定它是否一定会......您真的应该对此进行更多调查,因为 DirectShow 是在 Windows 上获取媒体内容的方式。
      【解决方案4】:

      我遇到了一个非常相似的问题,在向各种来源提出了正确的问题后,我想到了以下问题......

      任何有价值的解码器都会跳过“坏”数据,直到它到达有效的帧头。这就是 ID3v2 将附加信息注入 mp3 数据所依赖的。在服务器上,我会分析源 MP3 文件以仅提供有效的 MP3 帧。如果您提供一些无声帧(大约 7 个应该这样做),解码器应该有时间在为下一次加载(未关联的)MP3 数据之前稳定下来,避免在连接来自不同编码的帧时(正确)假设的伪影会议。

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

      你可能已经看过了,但如果没有:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我不确定我是否理解您在说什么,但看不出您的想法是如何实现定向广告的。我的收音机使用 SHOUTcast/Icy 协议,有各种播放器,所以我不能在客户端做任何事情。我说的是文件,因为这个问题无关紧要,但实际上我会使用动态生成的 MP3 流。
        • 这都是服务器端的......基本上服务器会将广告视为歌曲,除非您在歌曲和广告之间交替。我假设您将所有歌曲放在流中时没有将它们连接在一起......
        猜你喜欢
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        相关资源
        最近更新 更多