当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 25 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : [转帖]对 mp3 乱码问题的分析和解决
帖子发表于 : 2007-05-20 23:00 

注册: 2005-12-06 15:49
帖子: 174
送出感谢: 0 次
接收感谢: 0 次
最近尝试 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


_________________
开源软件是计算机工业最宝贵的财富。


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-05-20 23:05 

注册: 2005-12-06 15:49
帖子: 174
送出感谢: 0 次
接收感谢: 0 次
今天用foobar把硬盘上的2000多首MP3全部转了,ID3v2+APEv2,用Audacious播放没有乱码了。


_________________
开源软件是计算机工业最宝贵的财富。


最后由 _tsaichin 编辑于 2007-05-23 0:05,总共编辑了 1 次

页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-05-22 12:25 

注册: 2006-04-03 11:26
帖子: 551
送出感谢: 0 次
接收感谢: 1
已安装python-mutagen
但是mid3iconv: command not found
怎么回事?


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-06-01 15:32 
头像

注册: 2006-11-27 17:26
帖子: 58
送出感谢: 0 次
接收感谢: 0 次
谢谢楼主,按照你的方法转换成功。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-06-08 20:09 
头像

注册: 2006-05-26 23:40
帖子: 357
地址: http://ubuntufans.com
送出感谢: 0 次
接收感谢: 0 次
不错 :D :D
谢谢


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-06-08 23:11 

注册: 2007-06-06 11:11
帖子: 51
送出感谢: 0 次
接收感谢: 0 次
终于知道为什么乱码了,我今天下午还郁闷呢,谢谢了


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-06-11 14:39 

注册: 2007-01-14 15:27
帖子: 138
送出感谢: 0 次
接收感谢: 0 次
好,不错!用第二种方法转换成功了


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-06-18 17:07 

注册: 2007-01-29 11:24
帖子: 79
送出感谢: 0 次
接收感谢: 0 次
执行 find . -iname "*.mp3" -execdir mid3iconv -e gbk {} \; 失败!!!
在我这台机子上根本没反应。。。

测试了下 find . -iname "*.mp3" -print | mid3iconv -e gbk
同样无法成功。。。。 请教脚本高手能否编写一条能 自动进入各个子目录执行转换的命令阿~~~
机子上好几个G的MP3, 好累阿


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-07-02 15:27 
头像

注册: 2007-05-21 22:30
帖子: 36
地址: BIT
送出感谢: 0 次
接收感谢: 0 次
你首先得进入要转化的目录啊


_________________
△q△p=h/4π


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-07-21 1:27 
头像

注册: 2007-04-14 14:04
帖子: 190
地址: 湖北武汉
系统: Windows 8.1 x64
送出感谢: 0 次
接收感谢: 0 次
感谢LZ,正想解决这个问题呢


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-07-22 22:03 

注册: 2007-07-22 20:23
帖子: 12
送出感谢: 0 次
接收感谢: 0 次
文章很不错。不过还是不喜欢要转的,希望能做到播放器本身就正确读取


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-07-26 16:21 
头像

注册: 2007-04-14 14:04
帖子: 190
地址: 湖北武汉
系统: Windows 8.1 x64
送出感谢: 0 次
接收感谢: 0 次
好像论坛里有人在坐Linux下的千千静听,希望能解决这个问题


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2007-07-26 16:25 
头像

注册: 2007-04-14 14:04
帖子: 190
地址: 湖北武汉
系统: Windows 8.1 x64
送出感谢: 0 次
接收感谢: 0 次
删除掉ID3v1后Windows就读不出来了标签了,不过千千静听不受影响
为了让Windows也能正确识别,用千千静听把ID3v1 v2都写了
另外5.0版支持写入UTF8,看来支持2.4了


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2007-11-07 23:26 

注册: 2007-10-31 0:07
帖子: 32
地址: 中国四川
送出感谢: 0 次
接收感谢: 0 次
我也行了,非常感谢


页首
 用户资料  
 
15 楼 
 文章标题 :
帖子发表于 : 2007-11-09 15:07 
头像

注册: 2007-04-03 22:18
帖子: 333
送出感谢: 0 次
接收感谢: 0 次
貌似 audacious 1.3.2对中文支持很好


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 25 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译