请原谅我误用了术语,因为我仍在摸索。我不知道是否有“mp3 标签”或“id3 标签”,如果我有“id3 标签”,那么“v”是什么意思,甚至不知道这些术语之间是否有区别。
我有一些音轨,我发现当我在媒体播放器中收听它们时,我经常有机会“更新信息”,这意味着从数据库(通常是“MusicBrainz”)更新 mp3 标签。有一些实用程序可以获取/设置这些标签的值,而且在大多数情况下,这个过程非常简单。我一直在 Fedora 上使用“mid3v2”。
现在,关于 APIC 标签,...
如果我的媒体播放器更新了 mp3 标签,我将获得二AlbumArt_{}_.jpg”图像文件,一个 200x200“大”,一个 75x75“小”,这引发了一些问题,“为什么是两个?”,“APIC 标签可以有两个值吗?”,“我该如何设置这个标签?”,“我在哪里可以找到例子?”。
我已成功使用“mid3v2”设置标签值,并使用“mid3v2 -f”读取标签值,但 APIC 标签有所不同,只是因为它似乎具有更复杂的规范规则。阅读 APIC 并没有告诉我太多信息。
有人能解答我对 APIC 的困惑吗?也许可以举几个例子?
谢谢您的帮助,
克里斯。
答案1
我不知道我是否有“mp3 标签”或“id3 标签”,如果我有“id3 标签”那么“v”是什么意思,或者这些术语之间是否有区别。
ID3 实际上是标记 MP3 文件的唯一标准,因此这两个术语通常可以互换。不过,它们通常被称为 ID3 标签,因为它是一种单独的标准(由各种 MP3 播放器应用程序发明),而不是正确内置于格式中 - 而且因为一些其他非 MP3 格式可能也很少使用 ID3 标签。
ID3v1(即版本 1标记格式的功能非常有限,只有用于艺术家/专辑/标题的几个固定大小的字段(以及可供选择的固定流派列表)。
ID3v2(版本 2)中的所有内容都已完全重新设计,以允许 MP3 文件包含任意数量的标签/值字段(大致就像您在 中看到的一样mid3v2
)。
您仍然可以找到同时具有 v1 和 v2 标签的旧 mp3 文件(从 v2 还很新的时候开始),尽管现在没有理由再使用 v1。
ID3v2 有几个子版本;最常见的是 v2.3 和 v2.4 - 后者并不像 v2.3 那样受到普遍支持(例如,Windows 资源管理器去年左右才开始识别它),但 Mutagen 无论如何都会将您的所有文件升级到 v2.4。
如果我的媒体播放器更新 mp3 标签,我将获得两个 AlbumArt_{}_.jpg”图像文件,一个 200x200“大”,一个 75x75“小”,这就引发了一些问题:“为什么是两个?”,“APIC 标签可以有两个值吗?”,“我如何设置这个标签?”,“我在哪里可以找到示例?”。
“AlbumArt*.jpg”文件特定于 Windows Media Player - 它使用这些文件作为一种缓存,要么在将下载的专辑封面写入文件标签之前将其存储,要么完全避免读取嵌入的标签。
“为什么是两个?”——因为出于某种原因,Windows Media Player 的开发人员需要两个。这些文件与封面在 ID3 标签中的实际存储方式无关。
“APIC 标签可以有两个值吗?” – 是的,但是此功能旨在存储多个不同的封面(例如封面、封底、歌词册、光盘本身)而不是相同封面的不同尺寸。ID3v2.4 标准标签规范(第 4.14 节)讨论了这一点。
“我该如何设置这个标签?” – 使用-p/--picture
mid3v2 选项,或者使用 Python 模块编写自定义脚本mutagen
,或者使用支持此功能的媒体播放器导入封面。Foobar2000 允许您添加多个封面图像;许多其他播放器通常支持添加至少一个封面。
mid3v2 -p "cover.jpg:cover:3:image/jpeg" foo.mp3
这里3
是 mutagen.id3.PictureType.COVER_FRONT,而cover
是图像的“描述”。令人困惑的是,mutagen 允许多个 APIC 帧具有相同的类型(大多数播放器无法正确显示),但同时坚持描述是唯一的,因此如果您添加带有描述“封面”的新图像,它将覆盖先前具有相同描述的图像。
(我确实觉得 mutagen 意外地将类型和描述字段交换了。事实上,甚至 mid3v2 的“无效图片类型”错误消息也指向错误的字段 - mid3v2 使用第三个字段作为类型,但错误消息显示的是第二个字段。)
with open("cover.jpg", "rb") as fh:
apic = mutagen.id3.APIC(data=fh.read(),
type=mutagen.id3.PictureType.COVER_FRONT,
desc="cover",
mime="image/jpeg")
tags = mutagen.mp3.MP3("foo.mp3")
tags.add(apic)
tags.save()