You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mutagen或EyeD3的脚本无法为MP3保存封面图,求解决?

解决MP3封面无法保存的问题

针对你遇到的MP3封面无法保存的情况,以下是几个排查和修复方向:

1. 修正文件路径的转义问题

Python中字符串里的反斜杠\会被当作转义字符,可能导致路径解析错误。把路径改成原始字符串(加r前缀)或者用正斜杠:

file_path = r'Music\Metadata\sample-3s.mp3'
cover_image_path = r'Music\Metadata\pulsar.png'
# 或者用正斜杠替代
file_path = 'Music/Metadata/sample-3s.mp3'
cover_image_path = 'Music/Metadata/pulsar.png'

2. 确保ID3标签初始化正确

如果目标MP3原本没有ID3标签,直接用ID3(file_path)可能无法正确创建新标签。改用MP3类加载并强制初始化标签:

from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC, TALB, TPE1, TDRC, TCON

def set_mp3_metadata(file_path, album_name, artist, year, genre, cover_image_path):
    try:
        audio = MP3(file_path, ID3=ID3)
        # 若文件无ID3标签,初始化一个
        if not audio.tags:
            audio.add_tags()
        
        # 设置基础元数据
        audio.tags['TALB'] = TALB(encoding=3, text=album_name)
        audio.tags['TPE1'] = TPE1(encoding=3, text=artist)
        audio.tags['TDRC'] = TDRC(encoding=3, text=str(year))
        audio.tags['TCON'] = TCON(encoding=3, text=genre)
        
        # 先删除原有封面标签(避免覆盖失败)
        if 'APIC' in audio.tags:
            del audio.tags['APIC']
        # 添加新封面
        with open(cover_image_path, 'rb') as cover_file:
            audio.tags.add(APIC(
                encoding=3,
                mime='image/png',
                type=3,
                desc='Cover',
                data=cover_file.read()
            ))
        
        audio.save()
        print("Metadata updated successfully.")
    except Exception as e:
        print(f"Error: {str(e)}")

3. 验证图片格式与MIME类型匹配

确认封面图片的实际格式,若为JPG/JPEG,需把mime参数改成'image/jpeg'。可以用PIL快速验证:

from PIL import Image

with Image.open(cover_image_path) as img:
    print(img.format)  # 输出PNG或JPEG,对应修改mime参数

4. EyeD3的修复写法

如果用EyeD3,需确保标签存在,且显式指定ID3版本:

def set_mp3_metadata_eyed3(filename, album, artist, year, genre, cover_image_path):
    try:
        audio = eyed3.load(filename)
        if audio is None:
            print("Error loading MP3 file")
            return
        # 初始化标签(若不存在)
        if not audio.tag:
            audio.initTag()
        
        audio.tag.album = album
        audio.tag.artist = artist
        audio.tag.year = year
        audio.tag.genre = genre
        
        if cover_image_path:
            # 清空原有封面
            audio.tag.images.remove(3)
            with open(cover_image_path, "rb") as cover_file:
                cover_data = cover_file.read()
                audio.tag.images.set(3, cover_data, "image/png")
        
        audio.tag.save(version=eyed3.id3.ID3_V2_3)
        print("Metadata updated successfully.")
    except Exception as e:
        print(f"Error: {str(e)}")

5. 检查文件写入权限

确保脚本有修改目标MP3文件的权限,避免将文件放在系统保护目录(如C:\Program Files),必要时以管理员身份运行脚本。


内容的提问来源于stack exchange,提问作者PandaProgrammer22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:47