Linux 环境下 mid3v2 音频标签管理工具使用笔记

一、 工具简介

mid3v2 是一个在 Linux 环境下专门用来读写 MP3 ID3 标签的轻量级命令行工具。它基于功能强大的 Python 音频元数据处理库 mutagen 开发。

核心优势

  • 轻量快捷:程序体积仅几百 KB,运行时内存占用极小,非常适合在 Orange Pi 等 1核 1G 资源受限的 ARM 开发板上运行。
  • 中文兼容性极佳:继承了 mutagen 的编码自动识别与修复能力。能够完美处理国内下载网站中常见的 GBK 乱码标签,并将其自动转换为标准的 UTF-8 编码。
  • 专注于标签:相比于全功能的 eyeD3mid3v2 剔除了繁琐的音频帧分析和插件系统,专注于标签的读、写、删,执行效率更高。

安装方法(Ubuntu / Debian / Armbian 系统)

sudo apt-get update && sudo apt-get install -y python3-mutagen

二、 常用命令指南

1. 查看 MP3 标签信息

列出 MP3 文件中封装的歌手、歌名、专辑、轨道等核心元数据:

mid3v2 -l music.mp3

2. 修改/写入标签信息

  • 修改单个标签(歌名、歌手、专辑)

    mid3v2 -t "歌曲名" -a "歌手名" -A "专辑名" music.mp3
    

常用参数缩写说明:

  • -t--title:修改歌曲标题
  • -a--artist:修改艺术家/歌手
  • -A--album:修改专辑名称
  • -y--year:修改发行年份
  • -g--genre:修改流派
  • 修改歌曲轨道号(Track)

    mid3v2 -t "3" music.mp3
    

3. 删除指定标签

如果只想单独删除某一项信息(例如只删除年份,保留歌名):

mid3v2 --delete-frame=TDRC music.mp3

三、 清空 MP3 信息核心操作

mid3v2 在执行清空操作时,默认会直接覆盖原文件,不会产生任何 .mp3_original 备份文件,且绝对不会改变文件外部的文件名

1. 清空单个 MP3 的所有标签信息

彻底抹除该文件内部的所有歌手、歌名、封面等元数据:

mid3v2 --delete-all music.mp3

2. 一键清空当前目录下所有 .mp3 的所有信息

利用 Linux 通配符 *.mp3,实现对当前文件夹下所有 MP3 文件的批量“洗白”处理:

mid3v2 --delete-all *.mp3

四、 自动化脚本结合示例(Shell)

如果你需要定期清理某个目录(例如 /data/music)下的所有音乐文件标签,可以将以下内容写入一个临时的 .sh 脚本或直接在终端按顺序执行:

# 1. 进入音乐文件所在目录
cd /data/music

# 2. 检查当前目录下是否存在 MP3 文件并批量清空元数据
mid3v2 --delete-all *.mp3

# 3. 验证清空结果(查看第一个文件,确认输出无标签信息)
mid3v2 -l $(ls *.mp3 | head -n 1)

五、 批量修改脚本方案

1. 批量将“外部文件名”写入“内部歌名(Title)”

  • 适用场景:文件内部标签混乱、缺失,或带有国内下载站的垃圾广告信息,需要强制将播放器显示的歌名同步为清晰的外部文件名。
  • 单行简易命令

    for file in *.mp3; do [ -e "$file" ] || continue; song_name="${file%.mp3}"; mid3v2 -t "$song_name" "$file"; done
    
  • 多行结构脚本

    for file in *.mp3; do
      [ -e "$file" ] || continue
      # 提取去除后缀的纯文件名
      song_name="${file%.mp3}"
      # 仅写入 Title 标签
      mid3v2 -t "$song_name" "$file"
    done
    

2. 批量将“外部文件名”同时写入“歌名与专辑名” (规避 Navidrome 未知专辑问题)

  • 适用场景:专门用于解决 Navidrome、Subsonic 等流媒体服务器因歌曲缺失 TALB 标签而将大量歌曲归类到 [Unknown Album](未知专辑)的问题。
  • 批量命令

    for file in *.mp3; do
      [ -e "$file" ] || continue
      song_name="${file%.mp3}"
      # -t 写入歌名,-A 写入专辑名。使每首歌在流媒体系统中表现为同名的独立专辑
      mid3v2 -t "$song_name" -A "$song_name" "$file"
    done
    

3. 高级智能识别:将“歌手 - 歌名.mp3”文件名拆分写入

  • 适用场景:外部文件名具备标准规范(如 逃跑计划 - 夜空中最亮的星.mp3),脚本会自动以 -(前后带空格的短横线)为切分点,将前半部分识别为歌手,后半部分识别为歌名,实现一次性完美纠错。
  • 批量命令

    for file in *.mp3; do
      [ -e "$file" ] || continue
    
      # 去掉末尾的 .mp3 后缀
      raw_name="${file%.mp3}"
    
      # 检查纯文件名中是否包含 " - " 字段
      if [[ "$raw_name" == *" - "* ]]; then
          # 提取 " - " 前面的部分作为歌手 (Artist)
          artist="${raw_name%% - *}"
          # 提取 " - " 后面的部分作为歌名 (Title)
          title="${raw_name#* - }"
    
          # 同时修正歌名与歌手标签
          mid3v2 -t "$title" -a "$artist" "$file"
      else
          # 如果不包含分隔符,则将整个文件名赋给歌名
          mid3v2 -t "$raw_name" "$file"
      fi
    done
    

4. 极限清洗:仅保留“歌名、歌手、年份”,其余全部抹除

  • 适用场景:彻底剔除音乐文件内部嵌有的诸如高清封面、无用评论、流派、轨道号等冗余数据,降低文件体积,仅留下核心的三要素。
  • 批量命令

    for file in *.mp3; do
      [ -e "$file" ] || continue
    
      # 1. 提取原有的核心标签并暂存至变量(基于 ID3v2 帧代码过滤)
      TITLE=$(mid3v2 -l "$file" | grep '^TIT2=' | cut -d= -f2)
      ARTIST=$(mid3v2 -l "$file" | grep '^TPE1=' | cut -d= -f2)
      YEAR=$(mid3v2 -l "$file" | grep -E '^(TDRC|TYER)=' | cut -d= -f2)
    
      # 2. 彻底清空该文件内部的所有标签信息
      mid3v2 --delete-all "$file"
    
      # 3. 重新将提取出的核心三要素写回(若原本对应标签为空则安全跳过)
      mid3v2 ${TITLE:+-t "$TITLE"} ${ARTIST:+-a "$ARTIST"} ${YEAR:+-y "$YEAR"} "$file"
    done
    

标签: none

添加新评论