从MP3生成音量曲线
我正在尝试用Python做一个可以分析上传的mp3文件,并生成必要数据来制作波形图的东西。我找到的资料都比我需要的复杂得多。最终,我想做的东西就像你在SoundCloud上看到的那样。
我在研究numpy
和fft
,但感觉这些都比我需要的复杂。对此有什么好的方法吗?我会用canvas来制作实际的图形,所以这部分不用担心,我只需要绘制所需的数据。
2 个回答
MP3文件其实是声音波形的一种编码版本。在你能处理这个波形之前,得先把MP3数据解码成PCM波形。一旦你得到了PCM数据,每个样本就代表了某一时刻的波形幅度。如果我们假设MP3解码器输出的是带符号的16位值,那么你的幅度范围会在-16384到+16383之间。如果你把每个样本都除以16384进行归一化,那么波形样本的范围就会变成-1.0到+1.0之间。
问题的关键在于把MP3解码成PCM。根据我所知,Python没有内置的解码器。不过,你可以使用LAME这个工具,通过Python调用它作为一个子进程,或者稍微复杂一点,直接用SWIG把LAME库和Python连接起来。这可不是一件简单的事。
接下来,绘制这些数据就留给读者自己去做了。
如果你不想去研究mp3文件格式的复杂细节,我建议你使用Pygame。
Pygame是一个多媒体库,可以打开常见的音频文件格式,比如.mp3和.ogg,它们会被当作“声音”对象来处理。如果你安装了Numpy,你可以使用pygame.sndarray.array这个调用来浏览未压缩的声音(也就是经过fft变换后的声音),这个调用会返回一个包含声音样本的numpy数组对象。
我发现一个小技巧——确保在调用pygame.mixer.init时,使用和你的.mp3文件相同的参数(比如频率、位深和声道数),否则调用sndarray.array时可能会出现错误。
你可以查看文档,地址是http://www.pygame.org/docs/