歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux系統下Mp3標簽亂碼問題的分析和解決

相信很多朋友在Linux裡播放mp3的時候,不論使用何種mp3播放器,或多或少都會遇到mp3標簽亂碼的問題。我一般在遇到mp3標簽顯示亂碼的時候都是使用Ex Falso(Quod Libet自帶的一個mp3標簽編輯器)來編輯一下標簽,使我的播放器Quod Libet能夠正常識別mp3標簽。遇到轉換歌曲少的時候,這樣做沒有什麼問題,但是很多剛從Windows轉到Linux上來的朋友就頭大了,很多在Windows下顯示正常的mp3標簽在Linux下全都亂套了。

我們先來看看一些關於mp3的標簽和編碼的概念再來解決這個問題,大家就會比較清晰一些了。

mp3的標簽類型和編碼,現在主要存在這幾種標准,ID3v1、ID3v2 2.3、ID3v2 2.4、APEv2。它們分別支持的編碼為

ID3v1:只支持ISO--8859-1

ID3v2 2.3:ISO--8859-1、UTF-16

ID3v2 2.4:ISO--8859-1、UTF-16、UTF-8

APEv2:UTF-8

我們可以從上面的列表看出,mp3的標簽類型和編碼是多種多樣,沒有任何的規范可言的。ID3v1只支持ISO-8859-1這一種編碼,它是不支持中文的,所以一般來說只有ID3v1標簽的mp3在Linux上基本上也都是亂碼的命,而ID3v2 2.3支持的格式增加了UTF-16,直到ID3v2 2.4版才開始支持UTF-8,但是 ID3v2的兩個版本標准並沒有統一標簽內容的編碼。這裡值得一提的是APEv2,它擁有最好的擴展性,它把編碼格式統一為UTF-8,這樣一來只要支持APEv2讀取的播放器播放帶有APEv2標簽的mp3就不會存在亂碼問題。可惜的是現在在國內的網站上下載的mp3基本上都沒有APEv2標簽,而且Linux下也沒有幾個播放器支持APEv2標簽的讀取。(目前Gnome裡的Rhythmbox是支持APEv2標簽讀取的,包括Quod Libet都不可以。)

一首mp3的標簽是可以包含多種類型的,當一首mp3同時含有ID3v1、ID3v2 2.3、ID3v2 2.4、APEv2這4種類型中兩種以上的時候,播放器對mp3標簽的讀取順序一般是由上往下的,APEv2(前提是播放器支持此編碼的讀取)---ID3v2---ID3v1。所以有時候會出現同一文件Rhythmbox顯示標簽正常(讀取APEv2標簽),其他播放器不正常的情況(讀取了ID3的標簽)。

接著我們說說在Linux系統裡,為什麼所有的mp3播放器都會有亂碼的問題,這是因為這些mp3播放器都是依賴系統內的libid3tag庫完全按照ID3的標准來讀取標簽內容的。 它不論mp3是采取何種的標准的標簽(ID3v1、ID3v2、APEv2),只要mp3的標簽的內容是Unicode編碼存儲的,那麼顯示肯定是正常的(ID3v1的ISO-8859-1嚴格說是不支持中文,但是並不是代表它不能存儲中文)。如果遇到是以gbk、gb18030、big5等編碼的中文內容時,它還是會把它當成ISO-8859-1來讀取,亂碼就成了必然。

說了這麼多,現在問題就變得簡單了,似乎我們只需要把mp3標簽裡面用gbk、gb18030、big5等編碼存儲的中文內容修改為Unicode編碼,那麼基本上所有Linux下的播放器都能正常識別mp3標簽了。

關於mp3編碼的轉換,這裡介紹一個工具----Mutagen,假如你安裝了Quod Libet,那麼這個包已經安裝上去了。如果沒有,執行下列命令就可以了。

sudo apt-get install python-mutagen

工具的使用方法

mid3iconv -e gbk *.mp3 #轉換當前目錄的mp3文件

find . -iname "*.mp3" -execdir mid3iconv -e gbk {} \; #轉換當前目錄下所有mp3文件(包括子目錄)

因為現在在網上下載的mp3絕大多數采用的都是gbk/gb18030編碼,-e gbk 參數是代表把gbk編碼的標簽轉換為Unicode編碼,假如mp3標簽本身是Unicode編碼的就不轉換。如果需要轉換其他編碼的文件可以自行修改gbk參數,比如改為gb18030、big5。轉換後為的mp3標簽類型為ID3v2 2.4,編碼格式為UTF-16。

到了這一步之後,在Linux下使用所有播放器估計都沒有什麼問題了。

下面我們回過頭來看看,追溯一下根源,為什麼這些mp3原來在Windows下用Media Player怎麼都是顯示正常的呢?難道是Linux不如Windows嗎?其實這個道理很簡單,Firefox同樣也打不開很多IE輕松就能打開的頁面,能說明Firefox不如IE嗎?知情的人一看就明白了。Windows為了它所謂的兼容性,完全無視規范,自定規則,貌似它的軟件兼容性很好,其實到頭來,毀的還是用戶,從眾多的不符合W3C規范的網頁和現在鋪天蓋地的mp3標簽為gbk/gb18030編碼就可見一斑(反正我現在從網上下載的mp3在Linux下就沒有看到幾個能正常顯示的)。

可以告訴大家的是,利用上面的方法轉換編碼之後,這些mp3在Windows的文件屬性菜單和Media Player裡都無法正常顯示標簽,將會全部變為"?"。因為mid3iconv命令在轉換編碼時默認它會用Unicode編碼填滿D3v1, ID3v2, APEv2標簽(前提是文件本來就含有這些類型的標簽),但是 ID3v1 又不支持中文的 Unicode 編碼。而Media Player似乎只支持ID3v1的讀取,當然你使用其他的支持ID3v2、APEv2類型讀取的軟件是沒有問題的。

這裡給大家推薦一個Windows下的mp3播放器---Foobar2000,在以前Windows的生涯中,我一直都是使用的這個播放器,foobar2000支持全系列標簽的讀取,更值得稱贊的是它默認使用ID3v2 2.4類型UTF-8編碼的寫入,完全解決了編碼方面的問題。

給出一個個人提供的最終解決方案。

1.系統環境完全就是Linux。

直接使用下面的這條命令,轉換所有mp3文件,完全無視Windows下的使用體驗。

mid3iconv -e gbk *.mp3

當然了,如果你為了避免自己的mp3文件共享給Windows或者mp3的用戶時,出現煞風景的"?",你可以添加一個--remove-v1這樣一個參數來直接刪除ID3v1標簽,避免了文件屬性和Media Player裡出現"?"。

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

2.系統環境為Windows+Linux的雙系統

推薦使用foobar2000播放器,對文件進行mp3標簽的編輯,可以在foobar2000裡選中所有mp3文件,進行文件標簽重寫,foobar2000會把所有標簽進行重寫,使標簽采用ID3v2 2.4類型UTF-8編碼的寫入,完全解決Windows和Linux下mp3文件的編碼問題。這也是比較完美的解決辦法。

Copyright © Linux教程網 All Rights Reserved