如何使用Python将专辑封面嵌入MP3文件中?

33
我一直在使用Mutagen来读写MP3标签,但我希望能够直接将专辑封面嵌入到文件中。

1
这不是一个非常糟糕的想法吗?将同一张图片嵌入到单个专辑的所有mp3中,难道不会增加你的mp3大小吗?专辑封面应该属于存放专辑的文件夹。 - nosklo
2
@nosklo,有些MP3播放器只显示嵌入的图片,而不是文件夹中的图片。 - sdu
@nosklo 我发现我的mp3文件非常大,一个小缩略图并没有太大的区别。我估计平均大小为6MB,我允许我的缩略图最多达到60KB,因此它们只会增加1%的文件大小。对于JPEG格式来说,这已经足够了。 - Mark Ransom
5个回答

39

以下是使用mutagen将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()

2
这个不起作用;我按照上面的代码操作,但是出现了“TypeError:需要整数”的错误。 - Tensigh
1
对我来说也是一样,我得到了:TypeError: 'str' object cannot be interpreted as an integer。完整的跟踪和源代码在这里:https://gist.github.com/brutus/69c51cd706a6cf5d1594 - Brutus
1
我发现在“保存”中使用v2_version=3是必要的,这样新标签才能被Windows 7读取,并且我通过直接读入一个ID3对象来简化了这段代码。否则,这个答案是完美的,没有其他人报告的错误。 - Mark Ransom
@MarkRansom,您是如何“通过直接读取ID3对象来简化此代码”的?请在答案中发布您的代码。 - MagTun
5
非常好的答案,但就我的情况而言,我发现有必要添加 'rb' 模式来读取成功,就像这样:data=open('example.png', 'rb').read() - codezjx

13

我已经使用eyeD3模块完成了这个任务。

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()

从v0.7开始,使用方式如下:audiofile = eyed43.load(file_name)audiofile.tag.artist = artist等。请参见:http://eyed3.nicfit.net/ - user3141031
这篇博客很好地解释了使用更新和最新的API实现eyed3的方法。http://tuxpool.blogspot.in/2013/02/how-to-store-images-in-mp3-files-using.html - Rajeev Atmakuri
eyeD3不支持Unicode,因此每当音乐文件或图片的路径包含任何非ASCII字符时,它都会失败。因此,如果您有像“Canção do mar”、“Dvořák's 9. Simphonie”或“昨日は歌を歌いました”这样的歌曲,则无用。我建议使用Python的metagen模块。 - Jaccoud

3

看起来你需要为MP3添加一种特殊类型的框架。请参考ID3标签网站。

此外,mutagen的教程表明你可以在mutagen中添加ID3标签,请参见这里


1

可能的解决方案

你是否正在尝试将图像嵌入到许多文件中?如果是这样,我找到了一个脚本(请参见链接),它可以遍历一组目录,查找图像,然后将它们嵌入到MP3文件中。当我想在我的(现在已经失效的)iPhone上实际查看CoverFlow中的内容时,这对我非常有用。


1
链接已过期。 - bittterbotter

0
一个非常好用的小型CLI工具,帮助我在开发id3相关内容时进行了很多检查,它就是mid3v2,这是id3v2的mutagen版本。它与Python mutagen库捆绑在一起。这个小工具的源代码也为我提供了很多关于如何使用mutagen的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接