如何使用python从mp3文件中提取原始数据?

zha*_*gyu 5 python audio mp3 eyed3

我有关于使用Python进行音频数据分析的作业.我想知道是否有任何好的模块可供我从mp3文件中提取原始数据.我的意思是原始数据,而不是元数据,id3标签.

我知道如何使用该wave模块来处理.wav文件.我可以readframes获取原始数据.但我不知道如何处理mp3.我在google和stackoverflow上搜索了很多并找到了eyeD3.但不幸的是,文档相当令人沮丧,现在版本是0.7.1,与我在互联网上可以找到的大多数示例不同.

有没有可以从mp3中提取原始数据的好模块?如果有任何好的文档eyeD3,它也是好的.

Jia*_*aro 17

如果我理解你的问题,你可以尝试使用pydub(我写的一个库)来获取音频数据,如下所示:

from pydub import AudioSegment

sound = AudioSegment.from_mp3("test.mp3")

# sound._data is a bytestring
raw_data = sound._data
Run Code Online (Sandbox Code Playgroud)


Joh*_*sup 5

stackoverflow 上也有一些类似的问题。有不同的用例。

  1. 用户想要将 .mp3 文件转换为 PCM 文件,例如 .wav 文件。

  2. 用户想要访问 .mp3 文件中的原始数据(即,不将其视为压缩的 PCM)。这里的用例是了解 MP3 和 AAC 等压缩方案如何工作。

这个答案针对的是第二个,尽管我没有可以分享或指向的工作代码。

MP3 等压缩方案通常在频域中工作。作为一个简化的示例,您可以一次获取 1024 个样本的 .wav 文件,使用 FFT 转换 1024 个样本的每个块,然后将其存储。粗略地说,有损压缩会丢弃频域中的信息,以便允许更小的编码。

如果您只想将 .mp3 转换为 .wav,那么纯 Python 实现是非常不切实际的。但是,如果您想探索 .mp3 和相关方案的工作原理,拥有一些您可以轻松修改的东西,即使代码运行速度比 ffmpeg 使用的慢 1000 倍,实际上也是有用的,特别是如果以允许阅读源代码以了解 .mp3 压缩的工作原理。例如,请参阅http://bugra.github.io/work/notes/2014-07-12/discre-fourier-cosine-transform-dft-dct-image-compression/获取 IPython 工作簿,该工作簿介绍了频域变换的方式用于 JPEG 等图像压缩方案。MP3 压缩之类的东西对于学习压缩的人来说非常有用。

.mp3 文件基本上是 MP3 帧的序列,每个帧都有一个标头和数据组件。第一个任务是编写一个(或多个)Python 类来表示这些,并从 .mp3 文件中读取它们。首先以二进制模式读取文件(即 f = open(filename,"rb"),然后 data = f.read() ——在现代机器上,考虑到 .mp3 中一首典型的 5 分钟歌曲大约为 5MB,你不妨一口气读完整篇文章)。

也许还值得沿着这些思路编写一个更简单(效率低得多)的编码方案来探索它的工作原理,并逐渐添加 MP3 和 AAC 等使用的技巧方案。例如,将 PCM 输入文件拆分为 1024 个样本块,使用 FFT 或 DCT 等,然后再次返回,看看如何恢复原始数据。然后探索如何将数据从频率转换版本中丢弃,并查看转换回 PCM 数据时会产生什么效果。那么最终的结果一开始会很差,但是通过看到问题,并看看 MP3 和 AAC 的作用,您可以了解为什么这些压缩方案会这样做。

简而言之,如果您的用例是“完成任务”,那么您可能不想使用 Python。另一方面,如果您的用例是“学习如何完成工作”,那就不同了。(根据粗略的经验法则,您可以在 90 年代的 Pentium 100 上使用优化汇编来实现,您可以在现代 Core i5 上使用 Python 实现大致相同的性能 - 类似这样 - 有一个因素原始性能大约为 100,并且使用 Python 也有类似的减慢)。