四月 28th, 2007
对 mp3 乱码问题的分析和解决
Category: Ubuntu, Author: Nicky, Popularity: 32%最近尝试 Listen 和 Banshee 才发现,Rhythmbox 上出现的 mp3 乱码问题依旧,而且更加严重,想要彻底弄清和解决必须搞清两点,第一, mp3 标签类型和编码,第二,各种播放器对 mp3 标签读取情况,相信它们应该都有相关的开发文档来说明,但我还是用了一个最笨的方法,就是一个一个的测试来得出结论,真理不是来自于实践吗?
1、了解 mp3 标签类型和使用的编码
首先说 mp3 标签类型和编码,大家应该知道目前主要存在这几种标准,ID3v1, ID3v2 2.3, ID3v2 2.4, APEv2,ID3v1 只支持 ISO-8859-1 编码 (编码集参考),严格的说它是不支持中文的 (并不代表它不能储存中文信息,目前中文 mp3 的 ID3v1 标签都使用这个字段来储存 GBK/GB18030 编码的中文信息),而第二版 (ID3v2) 支持的格式增加了 utf-16,直到 2.4 版才开始支持 uft-8,但 ID3v2 标准没有统一标签内容的编码,例如 2.4 版的 ID3v2 你可以使用 ISO-8859-1 编码,也可以使用 utf-16/uft-8 这种 Unicode 编码格式。做得最好的是 APEv2,它不但有很好的扩展性,而且还把编码格式统一为 utf-8,这样一来只要支持 APEv2 读取的播放器播放带有 APEv2 标签的 mp3 就不会存在乱码问题。
2、了解各种播放器对 mp3 标签读取情况
接下来研究的就是各种播放器对这几种标准的标签支持程度,测试的播放器有:gnome 自带的 Rhythmbox 0.10.0, Listen 0.5, Banshee 0.12.1+dfsg-3, Quod Libet 0.24, Exaile! 0.2.8, GMPC 0.13.0, Audacious 1.2.2。
测试的方法很简单,用一个 mp3 文件,分别写入不同类型的标签 (排列组合下来共 20 多种),在 ID3v1 和 ID3v2 2.3/2.4 中分别使用不同的编码写入中文信息 (如 GBK 编码),然后用这些播放器去读取,得到其结果。从这次的测试结果来看,Rhythmbox 对各种 mp3 的标签支持最好,这主要归功于它支持 APEv2 标签的读取。而 Banshee 和剩下的播放器完全一样,都不支持 APEv2 的读取,这个就能很好的解释为什么一些 mp3 在 Rhythmbox 上正常,在其他播放器上就会乱码。原因是现在很多 mp3 为了兼容,都同时使用了 ID3v1 和 APEv2 标签,Rhythmbox 读取 ID3v1 一样会乱码,但它优先读取了 APEv2 标签,而 Banshee 这些播放器不支持 APEv2 就只能读取 ID3v1,当然会乱码了。
他们的共同特点就是,所依赖的 libid3tag 库完全按照 ID3 标准来读取标签内容。不管使用何种标准的标签,只要是读取以 Unicode 编码的中文内容,肯定没有问题,遇到 GBK/GB18030 编码的中文内容时,还是把它当成 ISO-8859-1 编码来读取,不乱才怪。
ps: Vista 上的 WMP 不支持 ID3v2 2.4 和 APEv2 标签的读取,但它很聪明不能读取就用文件名代替,千千静听支持全系列标签的读取,但不支持以 ID3v2 2.4 标准的写入,不知道即将发布的 5.0 有变化没有。foobar2000 v0.9.4.3 支持全系列标签的读取,默认使用 ID3v2 2.4 (utf-8) 写入,不愧被誉为经典。
3、解决办法
既然明白了乱码的原因,就得找解决办法,一种办法就像 Win 上的播放器一样,可以根据本地的编码方式来解码,或使用一些其他转码机制,要不还可以选择优先读取顺序。以上测试的播放器中除了 Audacious 外其他都不支自定义编码读取功能。另外一个解决办法就是把 mp3 标签转换为 Unicode 编码,这种方式既简单又支持标准,推荐大家使用。如果像 Banshee 一样支持显示文件路径也可以解决乱码问题,但这不是根本之道。
目前发现有 2 个工具可以把标签转换为 Unicode 编码,而且都支持批量转换。
1) 一个是周枫用 java 编写的 ID3iconv 0.2.1,最后更新时间为 2004/2/20。
使用方法:
java -jar ~/id3iconv-0.2.1.jar -e gbk *.mp3
如果想转换当前目录下的所有 mp3 (包括子目录):
find . -iname "*.mp3" -execdir java -jar ~/id3iconv-0.2.1.jar -e gbk {} \;
* 注意以上 ~/id3iconv-0.2.1.jar 位置根据自己情况而定
* 相信现在大陆绝大多数能找到的 mp3 标签都是以 GBK/GB18030 编码,使用 -e gbk 来处理就够了,当然你也可以使用 -e gb18030 来处理。
* -e gbk 参数是代表把 GBK 编码的标签转换为 Unicode 编码,本身是 Unicode 编码的就不转换。如果需要转换其他编码的文件可以自行修改,如改为 Big5。
* 经测试,转换后为 2.3 版的 ID3v2,编码格式为 uft-16
2) 另外一个是用 Python 写的 “Mutagen”,目前最新版本 1.11,Ubuntu 7.04 源里也带有 1.10 版本的 Mutagen,可以用这个命令来安装:
sudo apt-get install python-mutagen
ps:安装 Quod Libet 和 Listen 都必须这个
使用方法:
mid3iconv -e gbk *.mp3
如果想转换当前目录下的所有 mp3 (包括子目录):
find . -iname "*.mp3" -execdir mid3iconv -e gbk {} \;
* 相信现在大陆绝大多数能找到的 mp3 标签都是以 GBK/GB18030 编码,使用 -e gbk 来处理就够了,当然你也可以使用 -e gb18030 来处理。
* -e gbk 参数是代表把 GBK 编码的标签转换为 Unicode 编码,本身是 Unicode 编码的就不转换。如果需要转换其他编码的文件可以自行修改,如改为 Big5。
* 经测试,转换后为 2.4 版的 ID3v2,编码格式为 uft-16
* 不过它会同时用 Unicode 编码填满 D3v1, ID3v2, APEv2 标签,但是 ID3v1 又不支持中文的 Unicode 编码,所以转换后的 ID3v1 标签全是问号。所以最好加上 –remove-v1 参数,转换后删除 ID3v1 标签。
mid3iconv -e gbk --remove-v1 *.mp3
Tags:APEv2, Banshee, ID3v1, ID3v2, ISO-8859-1, Listen, mp3, Rhythmbox, Unicode.
评论数量(19) | Add Comments
本文网址:http://www.osxcn.com/ubuntu/mp3-tag-encoding.html


Rhythmbox对中文支持比较好,常用。Audacious全乱码,用文件名。奇怪的是,用Amarok 播放,nowplaing取不到东西
要是千千静听有linux版本的就完美了
Audacious:首选项 – 播放列表 – Song Display – Custom – %f
这个意思是使用文件名来显示这首歌曲,比 banshee 的显示路径好一点点,能把扩展名去掉更好。不过 Audacious 和千千静听/Foobar 一样使用 mpg123 来解码 mp3,效果比较好。
不过我还是喜欢直接转换掉,用什么播放器都没有问题。
正在发愁怎么解决播放乱码问题呢!!这样一来,系统就更加完美了!!
这个能不能修改wma呢??
wma 有 id3 标签吗?
我用mutagen转换并去除了id3v1标签,只剩下id3v2,audacious1.2.2是可以读取的,也没有什么乱码的问题
转换后,Rhythmbox部分big5的mp3还有乱码产生,不过Audacious对所有的big5都不支持
使用 mid3iconv -e Big5 *.mp3 转换也没有办法?
python写的eyed3也很好用。可以方便的转换编码。
另外:以前的beep-media-player和新近的bmpx都对gb18030的id3标签做过一些”work around“,都可以比较好的支持中文,一年半以前,我还在freenode的irc里和bmpx的作者还讨论过一些这方面的问题,他开始说是你们的好多mp3的id3标签编码都有问题,id3v2里面明明有个编码字段,许多中文GB2312之类的并没有对这个进行设置,请我们自行修正id3标签的问题,或者转换成unicode,utf8等,他们不会对这些”破“的id3标签做处理,因为他们不理会这些没有编码信息的id3v2标签。
后来我就写了个脚本调用eyed3转换了我mp3的id3编码。。可惜脚本丢了。
再后来就没有理会bmpx的开发,直到前一段时间发现,他们还是加了一些work around。。
ps:居然回复了这么长,主要是以前也弄过这些东西,比较有感触:)
非常感谢,这个问题一直没有解决,这下弄清楚出问题的地方了。
很好的文章!非常感谢。但转换后 listen 还是乱码,其它播放器可以。
还有一个问题,amarok 显示歌曲信息时的路径仍然是乱码。我的 music 在 ntfs 分区,怎么办呢? ntfs-3g 挂接 windows 分区是好的,中文正常。
总不能把十几G的mp3 在 win 下和 linux 下拷贝两份吧?
分析得十分细致,但是转换的办法并不好用啊。
看了这篇文章终于有点明白了,以前都没留意这些,不过我还有些问题,
在XP系统里,右击一个MP3文件,里面的摘要(艺术家,唱片,发行年代….之类的)是属于那种标签?
当我用千千静听打开一个含有APEv2信息的文件时,如果标签的读取顺序设置为APEv2>ID3v2>ID3v1,那么它会读取这个文件的APEv2信息,但这些信息跟在系统里看到的”摘要”信息不一样,不知道是不是因为”摘要”属于ID3v2原因??
如果在千千静听里把写入类型设置为APEv2的话,把里面的标题,艺术家都写好,按保存之后,”摘要”里看到的信息会全没了,这是为什么?还有,”年代”那一栏,如果我想精确到年月日,譬如2008.01.01这样写的话,保存后有没有问题?还有ID3v2编码类型用UTF-8好还是UTF-16,还是ISO-8859-1好??
Audacious 对编码的支持是比较好的,在首选项-播放列表中可以自定义Tag编码
很好的文章。我也打算使用banshee.
Good!
谢谢你提供了这么详细的内容. 关于转换MP3编码到utf8的方法, 还可以参考这篇文章.
上面使用foobar进行转换, 也挺简单的.
http://blog.chinson.idv.tw/2007/10/mp3-tag-utf-8.html