如何使用Python将唱片集艺术嵌入MP3?

如何使用Python将唱片集艺术嵌入MP3?,python,mp3,metadata,id3,albumart,Python,Mp3,Metadata,Id3,Albumart,我一直在使用诱变剂来读取和写入MP3标签,但我希望能够将相册艺术直接嵌入到文件中。看起来您必须为MP3添加一种特殊类型的帧。请参阅上的网站 另外,诱变剂教程暗示您可以在诱变剂中添加ID3标签,我已经使用该模块完成了这项工作 def update_id3(mp3_file_name, artwork_file_name, artist, item_title): #edit the ID3 tag to add the title, artist, artwork, date, a

我一直在使用诱变剂来读取和写入MP3标签,但我希望能够将相册艺术直接嵌入到文件中。

看起来您必须为MP3添加一种特殊类型的帧。请参阅上的网站

另外,诱变剂教程暗示您可以在诱变剂中添加ID3标签,我已经使用该模块完成了这项工作

def update_id3(mp3_file_name, artwork_file_name, artist, item_title):    
    #edit the ID3 tag to add the title, artist, artwork, date, and genre
    tag = eyeD3.Tag()
    tag.link(mp3_file_name)
    tag.setVersion([2,3,0])
    tag.addImage(0x08, artwork_file_name)
    tag.setArtist(artist)
    tag.setDate(localtime().tm_year)
    tag.setTitle(item_title)
    tag.setGenre("Trance")
    tag.update()

以下是如何使用诱变剂将example.png作为专辑封面添加到example.mp3中:

from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC, error

audio = MP3('example.mp3', ID3=ID3)

# add ID3 tag if it doesn't exist
try:
    audio.add_tags()
except error:
    pass

audio.tags.add(
    APIC(
        encoding=3, # 3 is for utf-8
        mime='image/png', # image/jpeg or image/png
        type=3, # 3 is for the cover image
        desc=u'Cover',
        data=open('example.png').read()
    )
)
audio.save()

mid3v2是一个很好的小型CLI工具,它帮助我检查了我在开发id3时所做的工作,它是id3v2的诱变剂版本。它与Python诱变剂库捆绑在一起。这个小工具的来源也给了我很多关于如何使用诱变剂的答案。


您是否正在尝试将图像嵌入到大量文件中?如果是这样的话,我找到了一个脚本(见链接),它遍历一组目录,查找图像,并将它们嵌入到MP3文件中。这对我来说很有用,因为我想在我的(现已失效的)iPhone上的CoverFlow中看到一些东西。

这不是一个很坏的主意吗?你会不会在一张专辑的所有mp3上多次嵌入同一张图片来增加你的mp3大小?相册艺术应该属于相册所在的文件夹。@nosklo有mp3播放器,只显示嵌入的图片,而不显示相册中的图片folder@nosklo我发现我的mp3文件太大了,一个小小的缩略图并没有多大区别。我估计我的平均大小为6MB,我允许我的缩略图最大为60KB,所以它们只增加了文件大小的1%。使用JPEG,结果是很多。这不起作用;我按照上面的代码进行操作,得到了“TypeError:需要一个整数”对于我来说也不是,我得到:
TypeError:“str”对象不能解释为整数。这里的完整跟踪和源代码:我发现有必要在
save
中使用
v2\u version=3
,以便Windows 7可以读取新标签,我通过直接读取
ID3
对象简化了此代码。否则,这个答案是完美的,没有其他人报告的错误。@MarkRansom,您是如何“通过直接读取ID3对象来简化此代码的”?请在答案中发布您的代码。答案很好,但在我的例子中,我发现有必要添加“rb”模式来读取成功,就像这样:
data=open('example.png','rb').read()
从v0.7开始,用法如下:
audiofile=eyed43.load(file_name)
audiofile.tag.artist=artist
,请看:这个博客很好地解释了eyed3的实现,它使用了最新的API。eyeD3不支持Unicode,因此每当指向音乐文件或图片的路径包含任何非ASCII字符时,它都会失败。因此,如果你有像“Canção do mar”、“Dvořák's 9.Simphonie”或昨日は歌を歌いました". 我建议使用Python的metagen模块。链接已过期。