在 Python 中编辑类似文件的对象上的 MP3 元数据?

Posted

技术标签:

【中文标题】在 Python 中编辑类似文件的对象上的 MP3 元数据?【英文标题】:Editing MP3 metadata on a file-like object in Python? 【发布时间】:2009-10-07 21:39:49 【问题描述】:

我们在 Python 中动态生成 MP3 文件,并且需要使用类似文件的对象在内存中编辑 ID3 标头。

PyPI 上的所有 ID3 库 出现 要求您将文件系统路径作为字符串传递。我觉得这很令人沮丧!

将我们生成的 MP3 写入磁盘(或 ramdisk)只是为了添加 ID3 标签是不可接受的,原因有很多,尤其是性能。

鉴于大量的 ID3 库,是否有一个 ID3 库可以简单地处理类文件对象?

【问题讨论】:

【参考方案1】:

对于那些在遥远的未来找到这个答案的人,mutagen 对我来说非常有效,它的 MP3 对象之一的构造函数采用 要么 文件路径 一个类似文件的对象(文档称它为“文件”)。

来自https://mutagen.readthedocs.io/en/latest/user/filelike.html

传递给 FileType 或 Metadata 的第一个参数可以是文件名或类似文件的对象,例如 StringIO(Python 3 中的 BytesIO),mutagen 会确定要做什么。

MP3("myfile.mp3")
MP3(myfileobj)

【讨论】:

这应该是 2019 年被接受的答案,也就是“遥远的未来”:)。顺便说一句,如果您使用的是 Django,并且您有一个带有 FileField 的模型,您只需将 FieldFile 对象传递给 mutagen,它就会按预期工作。例如。如果您有一个带有字段audio 的模型并且您有一个模型实例instance,则可以执行mutagen.File(instance.audio) 并且可以按预期访问info【参考方案2】:

StringIO 有帮助吗? http://docs.python.org/library/stringio.html

【讨论】:

问题是,我见过的所有库都无法使用 StringIO 或类似的东西,因为它们需要文件系统路径。 您不想修改其中一个更简单的库? 你能推荐一个简单的修改吗? 我只是浏览 PyPI 上的库,找到一个可以满足您的需求并且体积很小的库。您可以重新定义 open 以获取字符串(而不是文件名)并返回 fh,其中 fh = StringIO.StringIO(string_variable)。【参考方案3】:

嗯,答案似乎是不存在这样的动物。 python MP3框架黑客显然失去了对接口进行编程的优势。我们通过修改现有库解决了这个问题。

【讨论】:

【参考方案4】:

AFAIR 标记附加到文件末尾。您可能想学习格式并自己制作一个简单的库,这应该不是很困难。

此外,您可以考虑将它们临时存储在 tmpfs (ramdisk) 等文件系统上。

【讨论】:

是的。至于 tmpfs,它太老套了。我已经在内存中拥有该对象——为什么我需要复制它才能使用它? 因为您将节省编程时间。在 RAM 中复制相对便宜(在我使用 3 年的笔记本电脑上,5MB 文件需要 0.05 秒)。所以决定因素是你如何评价你的努力。与您的服务器需要执行的其他任务相比,唯一可能更重要的是该复制引入的服务器负载......我对您的代码一无所知,所以自己决定。 你完全正确,我们可能最终会这样做,或者推出我们自己的框架黑客策略。然而,问题的重点是通过发现一种可以节省我们编程时间的开箱即用解决方案来避免所有这些。黑客框架或黑客服务器是更多的工作,而不是更少,并且超出了这个问题的范围。

以上是关于在 Python 中编辑类似文件的对象上的 MP3 元数据?的主要内容,如果未能解决你的问题,请参考以下文章

怎么获取一段mp3格式的音频的播放时长

在 Python 中组合多个音频文件(有延迟)

如何在AIR应用程序中的as3中指向桌面目录上的文件

使用 python 创建有效的 .mp3 文件

在 python 中编辑 ID3-mp3 - 最新包?

编辑和添加 mp3 的 ID3 标签