【问题标题】:Python library to modify MP3 audio without transcoding无需转码即可修改 MP3 音频的 Python 库
【发布时间】:2008-11-22 02:30:54
【问题描述】:

在我开始一个小项目之前,我正在寻找一些关于 mp3 格式的一般性建议,以确保我不是在疯狂追逐。

我对 mp3 格式的内部结构的了解很少。理想情况下,我正在寻找一个可以将这些细节抽象出来的库。我更喜欢使用 Python(但也可以用其他方式说服)。

我想以一种相当简单的方式修改一组 mp3 文件。我对 ID3 标签不是很感兴趣,而是对音频本身很感兴趣。我希望能够删除部分(例如,从第 3 分钟开始减少 10 秒),并插入部分(例如,将学分添加到末尾。)

我的理解是 mp3 格式是有损的,因此将其解码为(例如)PCM 格式,进行修改,然后再次将其编码为 MP3 会降低音频质量。 (我很想知道我错了。)

推测如果我保持 mp3 格式,将会有某种最小帧或数据包大小需要处理,因此操作的粒度可能会更粗略。只要我能在几秒钟内获得准确度,我就可以忍受。

我查看了PyMedia,但它需要我迁移到 PCM 来处理数据。同样,LAME 想帮助我编码,但不想就地访问数据。我见过其他几个只处理 ID3 标签的库。

谁能推荐一个 Python MP3 库?或者,您能否驳斥我的假设,即往返 PCM 是不好且可以避免的?

【问题讨论】:

    标签: python mp3 codec


    【解决方案1】:

    如果你想做低级的事情,请使用pymad。它将 MP3 转换为样本数据的缓冲区。

    如果您想要更高级别的东西,请使用 Echo Nest Remix API(披露:我为日常工作编写了其中的一部分)。它包括几个例子。如果您查看cowbell 示例(即MoreCowbell.dj),您会看到一个pymad 的分支,它为您提供NumPy 数组而不是缓冲区。该数据类型可以更轻松地分割部分并对它们进行数学运算。

    【讨论】:

      【解决方案2】:

      我得到了三个高质量的答案,我感谢你们所有人(并为你们所有人投票)。我没有选择任何作为接受的答案,因为每个都针对一个方面,所以我想写一个摘要。

      您需要在 MP3 中工作吗?

      • 转码为 PCM 再转回 MP3 不太可能导致质量下降。

      • 不要过早优化音频质量;用一个简单的原型测试它并听它。

      在 MP3 中工作

      • 维基百科有一个MP3 File Format的摘要。

      • MP3 帧很短(1152 个样本,或仅几毫秒),允许在该级别实现中等精度。

      • 但是,Wikipedia 警告说“帧不是独立项(“字节库”),因此无法在任意帧边界上提取。”

      • 如果我真的想避免解码,现有库不太可能提供帮助。

      在 PCM 中工作

      这个级别有几个库:

      • LAME(最新版本:2017 年 10 月)
      • PyMedia(最新版本:2006 年 2 月)
      • PyMad(仅限 Linux?仅限解码器?最新版本:2007 年 1 月)

      更高层次的工作

      • Echo Nest Remix API(目前仅适用于 Mac 或 Linux)是 Web 服务的 API,支持相当复杂的操作(例如查找音乐节拍和节奏的位置等)

      • mp3DirectCut(仅限 Windows)是一个 GUI,显然可以执行我想要的操作,但作为一个应用程序。它不是开源的。 (我尝试运行它,收到拒绝访问安装程序错误,但没有跟进。GUI 不适合我,因为我想在不断变化的文件库上重复运行这些操作。)

      我现在的计划是从 PyMedia 开始,使用 PCM。谢谢大家的帮助。

      【讨论】:

      • “转码为 PCM 再转回 MP3 不太可能导致质量下降。”这句话是错误的。质量下降对你来说可能是可以接受的,但总会有损失。
      • @jrwren:请参阅 the source answer 了解我的来源。
      • 链接到Echo Nest Remix 不起作用(不再?)
      【解决方案3】:

      Mp3 是有损的,但它以一种非常特殊的方式是有损的。用于丢弃您的耳朵无法听到(或很难听到)的某些音频部分的算法。一遍又一遍地以相同的压缩级别重新执行压缩过程可能会为给定的一段音频产生几乎相同的结果。但是,一些额外的损失可能会慢慢累积。如果您要大量修改文件,这可能是个坏主意。如果您关心质量,这也是一个坏主意,但如果您关心质量,那么使用 MP3 是一个坏主意。

      您可以使用编码器和解码器构建一个测试,对几个不同的 mp3 文件重新编码几次并观察它们的变化,这可以帮助您确定劣化率并确定您是否可以接受.听起来您已经有了可以用来运行这个简单测试的库。

      MP3 文件由音频的“帧”组成,因此应该可以通过一些努力以最少的处理删除整个帧(删除帧,更新文件头中的一些小细节)。我相信帧很短(每个几毫秒),这将提供您正在寻找的精度。所以在MP3 File Format 上做一些阅读应该会给你足够的信息来编写你自己的python 库来做到这一点。这与传统的“音频处理”有点不同(因为您不关心精度),因此您不太可能找到执行此操作的现有库。正如您所发现的,大多数会首先解压缩音频,以便您可以进行完全细粒度的控制。

      【讨论】:

      • 我认为 MP3 帧是 ¹⁄₇₅ 秒,就像 CD 一样。我可能对持续时间有误,但如果我错了,我也不会太远。
      • 如果采样为 44100 Hz,我之前的评论是正确的。通常,每个 MPEG 1 Layer III 帧的长度为 1152 个样本。
      【解决方案4】:

      不是直接满足您的需求,而是查看mp3DirectCut 软件,它可以满足您的需求(作为 GUI 应用程序)。我认为源代码是可用的,所以即使你没有找到一个库,你也可以自己构建一个,或者使用 mp3DirectCut 的代码构建一个 python 扩展。

      【讨论】:

        【解决方案5】:

        关于在 MP3 域中删除或提取 mp3 文件中的 mp3 片段(即不转换为 PCM 格式并返回),还有开源包PyMp3Cut

        至于将 MP3 文件拼接在一起(例如在 mp3 文件的末尾或开头添加“Credits”),我发现只要文件具有相同的采样率(例如 44.1khz),您可以简单地连接 MP3 文件和相同数量的通道(例如,两者都是立体声或都是单声道)。

        【讨论】:

        • 请注意,PyMp3Cut 不适用于 VBR(可变比特率)mp3。
        猜你喜欢
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 2015-03-17
        • 2021-08-06
        • 2016-08-24
        相关资源
        最近更新 更多