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

Python中编辑WAV文件元数据的方法及Mutagen使用问题

Python实现WAV文件元数据新增与编辑的方案

WAV文件的元数据存储没有统一的强制规范,目前主流的存储方式分为RIFF原生INFO块、嵌入RIFF结构的ID3v2块两类,很多库只支持读不支持写,核心是没有适配两类存储逻辑的写入规则。

用Mutagen实现的正确写法

你之前的代码有两个核心错误,导致标签无法写入、显示异常:

  • 直接实例化mutagen.id3.Frame基类是无效的,Mutagen要求ID3帧必须使用对应字段的具体实现类,日期字段在ID3v2.4规范中对应的标准类是TDRC,旧版的TYER帧已被废弃。
  • 调用wavFile.tags.save()无法将标签写回文件,必须调用WAV文件实例本身的save方法。

修正后的可运行代码如下:

from mutagen.wave import WAVE
from mutagen.id3 import TDRC, TIT2, TPE1  # 分别对应日期、标题、艺术家字段,其他字段可查找对应ID3帧类引入

def update_metadata(wav_path: str, date: str):
    wav_file = WAVE(wav_path)
    # 若文件不存在ID3标签则先初始化
    if wav_file.tags is None:
        wav_file.add_tags()
    # 写入日期标签,encoding=3代表UTF-8编码,日期格式建议使用YYYY-MM-DD
    wav_file.tags.add(TDRC(encoding=3, text=date))
    # 调用文件实例的save方法将标签写回磁盘
    wav_file.save()

如果需要兼容只识别RIFF INFO块的老旧软件,可以直接操作RIFF字段写入,无需引入ID3相关类:

from mutagen.wave import WAVE

def update_metadata_riff(wav_path: str, date: str):
    wav_file = WAVE(wav_path)
    # ICRD是RIFF INFO块中创建日期的标准键名
    wav_file["ICRD"] = date
    wav_file.save()

代码运行后打印元数据会显示TDRC=date,对应预期的DATE字段,可被Foobar2000、VLC、Windows媒体播放器等主流工具正常识别。

兼容性更强的替代方案

如果不想区分RIFF、ID3的字段差异,可以使用pydub调用ffmpeg实现元数据写入,适配性更强,不需要记忆不同规范的键名:
首先安装依赖:
pip install pydub
注意:使用该方案前需要确保本地已安装ffmpeg并配置到系统环境变量,否则pydub无法完成文件读写操作。

代码示例如下:

from pydub import AudioSegment

def update_metadata_pydub(wav_path: str, date: str, **kwargs):
    audio = AudioSegment.from_wav(wav_path)
    tags = {"date": date}
    # 支持传入title、artist、album、genre等任意通用元数据字段
    tags.update(kwargs)
    # 导出时自动完成元数据写入,会自动兼容不同播放器的识别规则
    audio.export(wav_path, format="wav", tags=tags)

这个方案的缺点是本质是重新封装导出WAV文件,处理GB级大文件时速度比直接修改元数据块的Mutagen慢,普通大小的音频文件感知不到差异。

你之前遇到的Frame=date异常输出,就是因为使用了Frame基类导致Mutagen无法识别帧类型,无法完成序列化写入,替换为对应具体帧类即可解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:01:20