从MP3生成音量曲线

2 投票
2 回答
1508 浏览
提问于 2025-04-17 12:55

我正在尝试用Python做一个可以分析上传的mp3文件,并生成必要数据来制作波形图的东西。我找到的资料都比我需要的复杂得多。最终,我想做的东西就像你在SoundCloud上看到的那样。

我在研究numpyfft,但感觉这些都比我需要的复杂。对此有什么好的方法吗?我会用canvas来制作实际的图形,所以这部分不用担心,我只需要绘制所需的数据。

2 个回答

1

MP3文件其实是声音波形的一种编码版本。在你能处理这个波形之前,得先把MP3数据解码成PCM波形。一旦你得到了PCM数据,每个样本就代表了某一时刻的波形幅度。如果我们假设MP3解码器输出的是带符号的16位值,那么你的幅度范围会在-16384到+16383之间。如果你把每个样本都除以16384进行归一化,那么波形样本的范围就会变成-1.0到+1.0之间。

问题的关键在于把MP3解码成PCM。根据我所知,Python没有内置的解码器。不过,你可以使用LAME这个工具,通过Python调用它作为一个子进程,或者稍微复杂一点,直接用SWIG把LAME库和Python连接起来。这可不是一件简单的事。

接下来,绘制这些数据就留给读者自己去做了。

1

如果你不想去研究mp3文件格式的复杂细节,我建议你使用Pygame。

Pygame是一个多媒体库,可以打开常见的音频文件格式,比如.mp3和.ogg,它们会被当作“声音”对象来处理。如果你安装了Numpy,你可以使用pygame.sndarray.array这个调用来浏览未压缩的声音(也就是经过fft变换后的声音),这个调用会返回一个包含声音样本的numpy数组对象。

我发现一个小技巧——确保在调用pygame.mixer.init时,使用和你的.mp3文件相同的参数(比如频率、位深和声道数),否则调用sndarray.array时可能会出现错误。

你可以查看文档,地址是http://www.pygame.org/docs/

撰写回答