stackoverflow周围也有一些类似的问题。有不同的用例。用户希望将.mp3文件转换为PCM文件,如.wav文件。
用户希望访问.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