Mp3标签乱码问题分析与解决方案

出自Linux Wiki

在2010年4月12日 (一) 09:09由Chenxing (讨论 | 贡献)所做的修订版本

目前Linux中流行的很多播放器经常不能正确显示如歌曲名、专辑名等MP3 tag信息。本文将简要分析其原因,并给出几种解决方案。

目录

原因简析

MP3的歌曲名、艺术家、专辑名等信息都以一定的编码格式存储在MP3标签中。简单的说,乱码出现的原因就是播放器未能准确识别出MP3标签的中文编码格式。

具体的说,现在MP3文件的标签主要有几种标准:ID3v1、ID3v2(现在常见的又分为2.3和2.4)、APEv2。

ID3v1
这几乎是MP3文件最早的标签标准(1996年提出)。它对标签各字段的长度有严格的限制[1],且没有考虑多语言问题。于是,一些软件将GBK编码的中文直接写入标签的相应字段,从而基本解决了中文歌曲名等问题。(如果字段同时包含多种语言,这一方法就会出问题了)
ID3v2
1998年的ID3v2带来了不少改进。如支持变长字段、UTF-16编码等等[2]。2000年的ID3v2 2.4进一步支持UTF-8编码,但这一标准还未得到很好的支持(如Vista里的WMP[3])。

而Linux中的播放软件通常使用统一的ID3库,这一库只探测Unicode编码。导致用GBK编码的歌名未能正常显示。

解决方法

可以从两个角度解决这个问题。一是使用支持GBK编码的播放软件,二是转换已有MP3文件的标签编码。

方案一:选用支持GBK的MP3播放软件

目前,Linux中对中文支持较好的播放器主要有AudaciousSongbird

Audacious是Beep Media Player的继承,是一款小巧的软件,存在于DebianUbuntu等软件仓库中。使用Audacious时,在页面上按右键,首选项->播放列表->使用自动编码器检测这些编码,选中“简体中文”即可。

Songbird是一个大型软件,甚至在播放器加入了浏览网页功能,它支持Linux、Windows、Mac OS X系统。无需任何设置就可以支持中文,不过它不在软件仓库中,需要单独下载。

还有一些软件,可以通过简单的修改使其支持GBK编码的中文。如Exaile,由于它用Python写成,所以修改其源码并不复杂。

Hint.gif
提示:
Exaile的最新版本(svn)也已支持gbk编码的中文,在Exaile 0.3版本中,将会包括这一支持。

方法二:更改已有MP3文件标签的编码

Note.gif
注意:
请注意有些MP3播放器可能不能正确显示处理后的文件的标签信息,请慎用。

使用Foobar

Foobar可以方便地做这一修改,它是Windows中的软件,也可以在Linux中使用wine运行。要注意安装Foobar时要安上那个批量修改标签的支持。用Foobar打开要转换的音乐,右键->标签->重新写入标签,就可以了。也可以一次选中多个音乐进行转换。

使用mutagen

Note.gif
注意:
使用该方法处理过的MP3标签不能被Windows系统和Windows Media Player正确识别,不建议使用该方法!!
Hint.gif
提示:
如果不慎已用此方法处理过MP3文件,可使用Foobar恢复。先使用Foobar的更新标签功能删除其ID3v1标签,再让Foobar写入ID3v1标签。

Python写的mutagen也可以完成这一转换。[3]对于Debian/Ubuntu系统,可以安装python-mutagen。在命令中使用方法是:

mid3iconv -e gbk --remove-v1 *.mp3

如果想转换当前目录下的所有 mp3 (包括子目录):

find . -iname "*.mp3" -execdir mid3iconv -e gbk --remove-v1 {} \;
Hint.gif
提示:
有关find命令的使用方法,参见find

转换后为 2.4 版的 ID3v2,编码格式为UTF-16,已经是Unicode编码的文件不受影响。加入--remove-v1是为了避免Unicode编码的ID3v1 Tag使某些程序产生乱码。

参考资料

  1. ID3v1文档
  2. ID3官方网站
  3. 3.0 3.1 对MP3乱码问题的分析与解决
个人工具
简体繁体转换