无需转码的Python库来修改MP3音频
我想在开始一个小项目之前,了解一下mp3格式的一些基本知识,以确保我不会走弯路。
我对mp3格式的内部结构了解得不多。理想情况下,我希望能找到一个可以简化这些细节的库。我更倾向于使用Python(但如果有其他好的选择,我也可以考虑)。
我想以相对简单的方式修改一组mp3文件。我对ID3标签不太感兴趣,主要关注音频本身。我希望能够删除某些部分(比如从第三分钟开始删掉10秒),并插入一些内容(比如在最后加上鸣谢)。
我了解到mp3格式是有损的,所以如果把它解码成(例如)PCM格式,进行修改后再编码回mp3,音质可能会下降。(如果我错了,我很乐意听到。)
我猜测如果我一直使用mp3格式,可能会有某种最小的帧或数据包大小需要处理,这样操作的精细度可能会降低。我可以接受,只要能在几秒钟内达到准确性就行。
我看过PyMedia,但它需要我转换成PCM格式来处理数据。同样,LAME想帮我编码,但不让我直接访问数据。我还看到其他一些库只处理ID3标签。
有没有人能推荐一个Python的mp3库?或者,你能告诉我去PCM再回来的过程真的不好并且是可以避免的吗?
5 个回答
MP3是一种有损音频格式,但它的有损方式很特别。它使用的算法会丢掉一些你耳朵听不见(或者很难听见)的声音部分。重复进行同样程度的压缩,通常会得到几乎相同的音频结果。不过,随着时间的推移,可能会有一些额外的损失。如果你打算频繁修改文件,这可能不是个好主意。如果你对音质很在意,那么使用MP3本身就是个不太好的选择。
你可以用编码器和解码器做个测试,反复对几个不同的MP3文件进行重新编码,看看它们是怎么变化的,这样可以帮助你判断音质的下降速度,看看是否能接受。听起来你已经有一些库可以用来进行这个简单的测试了。
MP3文件是由“帧”组成的,所以只要稍微努力一下,就应该能在处理时最小化地删除整个帧(只需删除帧,更新文件头的一些小细节)。我相信每帧的长度都很短(大约几毫秒),这能提供你想要的精确度。因此,阅读一下MP3文件格式的相关内容,应该能让你获得足够的信息来编写自己的Python库来实现这个功能。这和传统的“音频处理”有很大不同(因为你不太关心精确度),所以你可能找不到现成的库来做这个。大多数库,如你所发现的,都会先解压音频,这样你就能进行更细致的控制。
如果你想做一些底层的操作,可以使用 pymad。这个工具可以把MP3音乐文件转换成一段样本数据的缓冲区。
如果你想要稍微高级一点的东西,可以使用 Echo Nest 的 Remix API(顺便说一下,我在我的日常工作中写过一部分)。这个API里有一些示例。如果你查看 cowbell 示例(也就是 MoreCowbell.dj),你会看到一个基于pymad的分支,它给你提供了一个 NumPy 数组,而不是一个缓冲区。这个数据类型让你更容易切割出特定的部分并进行数学运算。
我得到了三个很不错的回答,感谢大家的帮助。我没有选择任何一个作为最佳答案,因为每个回答都涉及了不同的方面,所以我想写个总结。
你真的需要使用MP3吗?
把音频转换成PCM格式再转换回MP3格式,通常不会导致音质下降。
不要急着优化音质;先用一个简单的原型测试一下,听听效果。
在MP3格式下工作
维基百科上有关于MP3文件格式的总结。
MP3的帧很短(1152个采样,只有几毫秒),在这个层面上可以达到适度的精度。
不过,维基百科提醒说:“帧不是独立的项目(‘字节储存区’),因此不能在任意帧边界提取。”
如果我真的想避免解码,现有的库可能帮不上忙。
在PCM格式下工作
在这个层面上,有几个库可以使用:
在更高层次上工作
Echo Nest Remix API(目前仅限Mac或Linux)是一个网络服务的API,支持相当复杂的操作(例如,找到音乐节拍和节奏的位置等)。
mp3DirectCut(仅限Windows)是一个图形界面应用,似乎可以执行我想要的操作,但它不是开源的。(我尝试运行它时,遇到了访问被拒绝的安装错误,之后没有继续跟进。图形界面不太适合我,因为我想在不断变化的文件库上重复运行这些操作。)
我现在的计划是从PyMedia开始,使用PCM格式。