Python库无需转码即可修改MP3音频

时间:2008-11-22 02:30:54

标签: python mp3 codec

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

我对mp3格式内部的理解很少。理想情况下,我正在寻找一个可以抽象出这些细节的库。我更喜欢使用Python(但可以说是不相信)。

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

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

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

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

有人可以推荐一个Python MP3库吗?或者,你能否解释我的假设,那就是去PCM和背部是坏的和可以避免的?

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

我得到了三个高质量的答案,我感谢你们所有人(并为所有人提供了支持)。我没有选择任何可接受的答案,因为每个都解决了一个方面,所以我想写一个总结。

您需要使用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)是支持相当复杂操作的网络服务的API(例如,查找音乐节拍和节奏的位置等)

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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