Linux下mp3乱码问题最佳解决方案及其原理

要说mp3乱码的问题,首先要从乱码的源头说起。

为什么播放器能识别一首歌的歌名、艺术家、专辑等内容,即便你的文件名是乱打的。这是因为mp3文件里面有ID3tags这么一个东西(MP3文件曲目标签)。

wikipedia:

ID3是一种metadata容器,多应用于MP3格式的音频文件中。它可以将相关的曲名、演唱者、专辑、音轨数等信息存储在MP3文件中。

ID3有两个版本,分别是ID3V1和ID3V2。

windows系统本身只支持ID3V1这个版本。对于ID3V2,在系统自带的软件中都是忽略不计的。所以,如果一首歌只有ID3V2而没有ID3V1的话,用windows media player,或者别的一些windows软件(比如real player),都不能显示出歌曲的信息。不过很多比较流行的软件,比如千千静听,是能识别出ID3V2的。而在linux下面,默认是支持ID3V2的。

图1:本歌有ID3V2,没有ID3V1,windows无法识别ID3V2.

乱码问题就出在对ID3的编码上面。windows默认是GB2312编码,而linux却是UTF-8编码。中国绝大多数的MP3都是给windows用户使用的,所以绝大多数的MP3都会使用GB2312来编码ID3。这就造成了乱码。

早些时候,网上搜索linux乱码问题,给出的答案都是把ID3转成UTF-8格式,这样在linux下面就不会乱码。但是这样做有一个很大的副作用——就是在windows下面,这些MP3就乱码了。所以把ID3V1和V2全部转成UTF-8格式显然不是万全之策。

要让MP3在windows下面和linux下面都不乱码,解决办法是ID3V1和ID3V2使用不同的编码。

现在的linux播放器,以及主流的支持ID3V2的windows播放器在读取ID3的时候都遵照先读V2,再读V1的顺序。而且,windows下主流播放器,比如千千静听等,是支持UTF-8编码的识别的。所以要让MP3在两个系统下都不乱码,只要解决windows media player和linux播放器的乱码问题就行了。

图2:千千静听的MP3标签读取优先级

根据以上,可以分析出,出现乱码的情况无外乎以下几种:

  • linux下乱码:
    • ID3V2为GB2312编码,ID3V1为任意编码;//由于播放器的V2优先,所以读取了GB2312编码的V2标签,导致乱码。
    • ID3V1为GB2312编码,ID3V2缺失;//此时没有V2,所以只能读取V1。
  • windows下乱码:
    • ID3V1为UTF-8编码;//windows media player不支持V2,故读取V1
    • ID3V1缺失;//windows media player无法读取任何歌曲信息。

 

所以,只要把ID3V2编码为utf-8,而将ID3V1编码成GB2312,就可以达到都不乱码的效果。

要将现有的音乐批量用上述组合编码,我使用linux下面的kid这个软件。

打开软件,首先进行设置(settings)。将ID3V1和ID3V2分别指定为GB18030和UTF-8。

图3:kid设置

接下来,用kid打开MP3文件。如果发现右边TAG任何一部分有乱码,说明这个MP3tag需要转码。

图4:需要转码

由于绝大部分的MP3都是有GB2312编码的ID3V1.所以将所有的歌选中,在右边栏里的TAG2下面,点击from tag1。

图5:批量操作

然后将他们保存。这样就可以看见所有的歌曲都拥有V1和V2的标签,并且都不乱码了,此时V1已经用GB18030编码,V2用UTF-8编码。在win和lin都不会乱码了。

3 Comments

Post a Comment