Python 在 Mac OS 上以块的形式解码 MP3

Posted

技术标签:

【中文标题】Python 在 Mac OS 上以块的形式解码 MP3【英文标题】:Python decode MP3 in chunks on Mac OS 【发布时间】:2012-12-27 17:48:16 【问题描述】:

我有一个 Tornado Python 服务器,它一次接受一个块的可变比特率 mp3 文件(这些块由固定数量的帧组成)。

我所做的只是将二进制文件向前传递,但是,我想知道块的持续时间。因为它是可变比特率,所以我无法进行简单的计算。我正在研究 pymedia,但我在 mac OS 上开发,似乎 pymedia 无法安装在那里(而且,它自 2006 年以来一直没有更新)。我也试过 pymad 但无法安装它(它自 2007 年以来一直没有更新),无论如何它似乎更以文件为中心。

理想情况下,我想以mutagen 的方式从每个块中提取比特率。但是,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 以小块编码,因此我当前的解决方案是使用允许简单计算的恒定比特率,我意识到在这里使用可变比特率几乎没有任何好处。

【问题讨论】:

我怀疑你会找到适合你的情况的东西。 MP3 处理的诱变源似乎没有那么大,可能基于它自己实现一些东西? 意识到对于实时流式传输音频块,可变比特率并没有真正提供任何优势。事实上,它提供了一个缺点。我现在明白为什么没有人为此创建工具了,它并不是真的有用!无论如何,我可能会创建这样一个工具,因为即使比特率恒定,测量任何音频帧的比特率也是有用的。 【参考方案1】:

每帧有 1,152 个样本,因此如果您的块是固定数量的 N 帧,那么您的块是固定长度的 N*1152 样本。要将其转换为毫秒,您需要从帧头中找到采样率。

您只需要一个 MP3 解析器。这是完整解码器的源代码:https://bitbucket.org/portalfire/pymp3 包括帧头解析代码,这真的是你所需要的。

以下是有关格式的更多文档: http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header

【讨论】:

以上是关于Python 在 Mac OS 上以块的形式解码 MP3的主要内容,如果未能解决你的问题,请参考以下文章

如何以块的形式写入文件以规避大文件大小的错误?

python 以块的形式读取文件而不将整个文件加载到内存中。

以块的形式处理比物理内存大得多的数据

python 在Quantopian中创建一个管道实例并以块的形式运行以避免内存过载。包括管道的常见导入。

以块的形式保存位图图像

在c#中以块的形式读取整个文件