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