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

2024-05-21 04:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有关于使用Python进行音频数据分析的家庭作业。我想知道有没有什么好的模块可以用来从mp3文件中提取原始数据。我是说原始数据,而不是元数据,id3标签。

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

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


Tags: 模块文件数据文档原始数据google标签音频
4条回答

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

  1. 用户希望将.mp3文件转换为PCM文件,如.wav文件。

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

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

MP3等压缩方案通常在频域工作。作为一个简单的例子,您可以一次获取一个.wav文件1024个样本,使用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分钟歌曲大约为5 MB,那么您也可以一次性读取整个文件。

按照这些思路编写一个更简单(而且效率要低得多)的编码方案来探索它的工作原理也是值得的,随着时间的推移,可以逐渐添加MP3和AAC这样的技巧方案。例如,将一个PCM输入文件分割成1024个样本块,使用FFT或DCT或其他方法,然后再返回,看看如何恢复原始数据。然后探索如何将数据从频率转换版本中丢弃,并查看它在转换回PCM数据时的效果。一开始,最终的结果将非常糟糕,但是通过看到问题,并看到MP3和AAC所做的事情,您可以了解到为什么这些压缩方案以它们的方式做事情。

简而言之,如果您的用例是一个“完成任务”用例,那么您可能不想使用Python。另一方面,如果你的用例是一个“学习如何完成事情”的用例,那就不一样了。(作为一个粗略的经验法则,从90年代开始,在奔腾100上使用优化后的程序集可以做些什么,在现代核心i5上使用Python可以达到大致相同的性能——大概是这样——原始性能有100倍左右,使用Python也会有类似的减速)。

你试过以读取二进制模式打开文件吗?

f = open("test.mp3", "rb")
first16bytes = f.read(16)
etc...

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

from pydub import AudioSegment

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

# sound._data is a bytestring
raw_data = sound._data

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

  1. 用户希望将.mp3文件转换为PCM文件,如.wav文件。

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

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

MP3等压缩方案通常在频域工作。作为一个简单的例子,您可以一次获取一个.wav文件1024个样本,使用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分钟歌曲大约为5 MB,那么您也可以一次性读取整个文件。

按照这些思路编写一个更简单(而且效率要低得多)的编码方案来探索它的工作原理也是值得的,随着时间的推移,可以逐渐添加MP3和AAC这样的技巧方案。例如,将一个PCM输入文件分割成1024个样本块,使用FFT或DCT或其他方法,然后再返回,看看如何恢复原始数据。然后探索如何将数据从频率转换版本中丢弃,并查看它在转换回PCM数据时的效果。一开始,最终的结果将非常糟糕,但是通过看到问题,并看到MP3和AAC所做的事情,您可以了解到为什么这些压缩方案以它们的方式做事情。

简而言之,如果您的用例是一个“完成任务”用例,那么您可能不想使用Python。另一方面,如果你的用例是一个“学习如何完成事情”的用例,那就不一样了。(作为一个粗略的经验法则,从90年代开始,在奔腾100上使用优化后的程序集可以做些什么,在现代核心i5上使用Python可以达到大致相同的性能——大概是这样——原始性能有100倍左右,使用Python也会有类似的减速)。

相关问题 更多 >