6

这是我一段时间以来一直在尝试做的事情,而且更像是一个开放式问题。如果有人有任何知识可以帮助我对此有所了解,将不胜感激。

我想解码 mp3 中的音频流并使用它来驱动动画,全部使用 python。据我了解,mp3 中的音频数据存储在 32 个频率子带(或频率箱)的帧中,这对我来说是理想的 - 如果我可以使用 mp3 并为每个帧上的每个子带提取幅度,那将完美地完成我想做的事。

我在这里找到了解决方案https://bitbucket.org/portalfire/pymp3,所有处理似乎都是在 python 中完成的。这很慢,但即使我可以用它来提取我想要的东西,它也会很好 - 我正在努力理解该代码中发生了什么。我还有一个解决方案,我转换为 wav,然后使用 fft 从 wav 中提取频率。这非常嘈杂,似乎是一种愚蠢的方法,因为我想要的数据直接存储在 mp3 中 - 转换回声波似乎没有必要。这实际上比第一个更快。这就是我最终得到的结果:

http://www.youtube.com/watch?v=f_0FORxlK4A

好吧,如果有人有任何建议,或者他们想分享的经验,或者我应该看的图书馆的想法,我真的很想听听。

谢谢!

亨利

4

1 回答 1

2

看一眼:

http://lightshowpi.org/

嗅探源代码,看看他们是如何做到的。

他们还在波形输出上使用了 FFT,但它是实时的,而且它并不像您认为它在 Raspberry Pi 上工作得那么慢。

他们可能会改用余弦变换,因为它更快,如果直接检查 MP3 帧,这就是你要做的,因为 MP3 是余弦变换编码的。

因此,您首先必须知道哪个 bin 与现实世界中的哪个频率相似。

在 pypi.python.org 上,现在有 AV 或 ffmpeg 直接绑定允许您逐帧解码,但我不知道您是否可以从表示帧的对象中提取频率,或者您也必须首先转换为原始数据。

如果我是你,我会使用你找到的纯 Python MP3 代码来提取我需要的内容,并在此过程中对其进行优化。如果需要,使用 cython。

但这种方法将您限制为仅限 MP3。Lightshow Pi 适用于几乎所有压缩类型。

于 2016-05-04T15:43:47.157 回答