我有一个 Tornado Python 服务器,它一次接受一个 block 的可变比特率 mp3 文件( block 由固定数量的帧组成)。
我所做的只是向前传递该二进制文件,但是,我想知道 block 的持续时间。因为它是可变比特率,所以我无法进行简单的计算。我正在研究 pymedia,但我在 mac OS 上开发,似乎 pymedia 无法安装在那里(而且,它自 2006 年以来就没有更新过)。我也尝试过 pymad 但无法安装它(它自 2007 年以来一直没有更新),无论如何它似乎更以文件为中心。
理想情况下,我想以 mutagen 的方式从每个 block 中提取比特率例如。然而,mutagen 需要一个文件作为输入,而我希望输入一个 mp3 帧或一系列这样的帧。
def _on_read_frames(self, data):
logging.info('read from input:\n%s', data)
binary_audio = base64.b64decode(data)
# need to find out how many miliseconds went by here
更新: 这是近实时流架构的一部分,因此 mp3 被编码成小块,所以我目前的解决方案是使用允许简单计算的恒定比特率,我意识到在这里使用可变比特率几乎没有任何好处。
最佳答案
每帧有 1,152 个样本,因此如果您的 block 是固定数量的 N
帧,那么您的 block 是固定长度的 N*1152
个样本。要将其转换为毫秒,您需要从帧头中找到采样率。
您只需要一个 MP3 解析器。这是完整解码器的源代码:https://bitbucket.org/portalfire/pymp3 包括帧头解析代码,这确实是您所需要的。
这里是关于格式的更多文档: http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header
关于Python 在 Mac OS 上以 block 的形式解码 MP3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058912/