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

标签 python audio header mp3 bitrate

我有一个 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/

相关文章:

python - 通过pygame.sndarray播放正弦波时出错

Angular:如何解决SameSite Cookie问题

php - Pico CMS 自定义 header

php - cron php如何停止附加到文件的标题

python - 互斥体适用于快速的单一作者/缓慢的读者(cpython)?

python - 我的IF语句出现语法错误,不确定为什么吗?

java - 如何将 .wav 文件转换为 Base64 编码字符串?

python - asyncio 运行多个任务,同时保留顺序并处理错误

Python Click autocomplete for (str, str) 选项

ios - 在iOS中检测音频文件中的间隙