19

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

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

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

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

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

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

谁能推荐一个 Python MP3 库?或者,你能不相信我的假设,即往返 PCM 是不好的和可以避免的吗?

4

5 回答 5

7

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

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

于 2008-11-22T03:35:23.317 回答
6

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

你需要在 MP3 中工作吗?

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

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

在 MP3 中工作

  • 维基百科有一个MP3 文件格式的摘要。

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

  • 然而,维基百科警告说“帧不是独立的项目(“字节库”),因此不能在任意帧边界上提取。

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

在 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。谢谢大家的帮助。

于 2008-11-24T00:42:43.557 回答
3

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

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

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

于 2008-11-22T03:01:08.537 回答
1

不能直接满足您的需求,但请检查mp3DirectCut软件,它可以满足您的需求(作为 GUI 应用程序)。我认为源代码是可用的,因此即使您没有找到库,您也可以构建自己的库,或者使用 mp3DirectCut 中的代码构建 python 扩展。

于 2008-11-22T03:16:23.433 回答
1

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

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

于 2009-04-26T13:13:34.583 回答