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
相关产品推荐
相关产品推荐

