用于修改MP3音频而无需转码的Python库

u1ehiz5o  于 2022-12-10  发布在  Python
关注(0)|答案(5)|浏览(225)

我正在寻找一些关于mp3格式的一般建议之前,我开始一个小项目,以确保我不是在一个野鹅追逐。
我对mp3格式的内部结构了解甚少。理想情况下,我正在寻找一个能够将这些细节抽象出来的库。我更喜欢使用Python(但可能会被说服)。
我想以一种相当简单的方式修改一组MP3文件。我对ID3标签不太感兴趣,但对音频本身很感兴趣。我希望能够删除部分(例如,从第3分钟开始删除10秒),并插入部分(例如,在结尾添加致谢)。
我的理解是,MP3格式是有损耗的,因此将其解码为(例如)PCM格式,进行修改,然后再次编码为MP3将降低音频质量。(我很乐意听到我错了。)
我猜想,如果我保持mp3格式,将有某种最小帧或数据包大小要处理,所以操作的粒度可能会更粗糙。我可以接受,只要我得到一个在几秒内的准确性。
我看过PyMedia,但它要求我迁移到PCM来处理数据。类似地,LAME希望帮助我编码,但不访问适当的数据。我看过其他几个只处理ID3标记的库。
有人能推荐一个Python MP3库吗?或者,你能纠正我的假设,即去PCM和回来是坏的和可以避免的吗?

8wtpewkr

8wtpewkr1#

如果你想做一些低级的事情,使用pymad。它把MP3变成一个样本数据的缓冲区。
如果你想要更高级的东西,使用Echo Nest Remix API(披露:我为我的日常工作写了一部分)。它包含了一些例子。如果你看一下cowbell的例子(即MoreCowbell.dj),你会看到pymad的一个分支,它给你一个NumPy数组而不是一个缓冲区。这种数据类型使它更容易切片和计算。

kgsdhlau

kgsdhlau2#

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

您需要使用MP3吗?

  • 转码为PCM再转码回MP3不太可能导致质量下降。
  • 不要过早地优化音频质量;用一个简单的原型来测试它并听它。
    使用MP3
  • 维基百科有一个MP3 File Format的摘要。
  • MP3帧很短(1152个样本,或仅几毫秒),允许该级别的中等精度。
  • 然而,Wikipedia警告说,“帧不是独立项(“字节库”),因此不能在任意帧边界上提取。”
  • 如果我真的想避免解码,现有的库不太可能有帮助。
    在PCM中工作

此级别有几个库:

  • LAME(最新版本:2017年10月归档
  • PyMedia(最新版本:二○ ○六年二月)
  • PyMad(仅限Linux?仅限解码器?最新版本:2007年1月)
    在更高的层次上工作
  • Echo Nest Remix API(目前仅适用于Mac或Linux)是一个Web服务的API,它支持非常复杂的操作(例如查找音乐节拍和克里思的位置等)。
  • mp3 DirectCut(仅限Windows)是一个GUI,它显然可以执行我想要的操作,但作为一个应用程序。它不是开源的。(我试图运行它,得到了一个访问被拒绝的安装程序错误,并没有跟进。GUI不适合我,因为我想重复运行这些操作的变化库的文件。)

我现在的计划是从PyMedia开始,使用PCM。

wnvonmuf

wnvonmuf3#

Mp3是有损耗的,但它是以一种非常特殊的方式损耗的。所使用的算法被设计成丢弃你的耳朵无法听到的音频的某些部分以相同的压缩级别一次又一次地重复进行压缩过程可能对于给定的音频片段产生 * 几乎 * 相同的结果。一些额外的损失可能会慢慢积累。如果你要修改文件很多,这可能是一个坏主意。如果你关心质量,这也是一个坏主意,但如果你关心质量,使用MP3是一个坏主意。
你可以用一个编码器和一个解码器来构建一个测试,对几个不同的mp3文件进行几次重新编码,观察它们是如何变化的,这可以帮助你确定恶化的速度,并判断你是否可以接受。听起来你已经有了可以用来运行这个简单测试的库。
MP3文件是由音频“帧”组成的,因此应该有可能,通过一些努力,以最小的处理删除整个帧(拆卸车架、更新文件头中的一些小细节)。我相信帧是相当短的(每个数毫秒),这将给予您所需的精度。因此,在MP3 File Format上做一些阅读应该会给予你足够的信息来编写你自己的python库来做这件事。(因为你不关心精确度),所以你不太可能找到一个现有的库来做这件事。正如你所发现的,大多数库会先解压缩音频,这样你就可以拥有完全的细粒度控制。

yvfmudvl

yvfmudvl4#

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

llycmphe

llycmphe5#

至于从mp3文件中删除或提取mp3片段,同时保持在MP3域中(即,不转换为PCM格式和相反),也有开源包PyMp3Cut
至于拼接MP3文件在一起(添加例如'学分'到一个MP3文件的结束或开始),我发现你可以简单地连接MP3文件提供的文件有相同的采样率(例如44.1khz)和相同数量的通道(例如都是立体声或都是单声道)。

相关问题