android撞叽,java獲取MP3文件信息(作者姻成,專輯等)

接著上一篇文章, 上一篇把ndk開發(fā)遍歷手機(jī)文件分享了一下愿棋。遍歷出來的MP3文件科展,我需要展示在android的listview里面,想展示的好看一點(diǎn)糠雨,結(jié)果發(fā)現(xiàn)又是一個(gè)坑才睹。

根據(jù)mp3文件,獲取作者啊專輯啊冕屯,不難疗我,但是會出現(xiàn)各種亂碼,煩不勝煩首繁。

1坞琴,先普及下這個(gè)的知識哨查,MP3文件本身是沒有這些信息的,但是很顯然沒有信息剧辐,用戶體驗(yàn)不行寒亥,所以在某某年(百度百科ID3)有人就加了一個(gè)ID3V1放在MP3文件的后面;再后來因?yàn)槟衬吃蛴兀腥税堰@個(gè)升級了溉奕,變成ID3V2放在了MP3的前面(當(dāng)然ID3V1還在的)。所以現(xiàn)在有些文件是V1的羞酗,有些文件是V2的腐宋,在獲取信息之前要先判斷,是V1檀轨,還是V2, 當(dāng)然還有一些MP3是兩個(gè)都不存在的胸竞,一般就是我們看到的未知。如下圖

獲取不到信息的情況

2参萄,然后我們講一下網(wǎng)絡(luò)上面的資源

(1)卫枝,https://sourceforge.net/projects/javamusictag/

這個(gè)地址是一個(gè)好資源,里面有jar工具包讹挎,也有源代碼校赤;

(2),http://www.ulduzsoft.com/2012/07/parsing-id3v2-tags-in-the-mp3-files/

這里面是一個(gè)java文件筒溃,解析V2的马篮,沒有解析V1。

以上兩個(gè)都是需要做修改的才能被我們使用怜奖,否則就是要么亂碼浑测,要么不解析。

我們先說第一個(gè)資源吧:

(1)歪玲,這個(gè)是比較全面的JAR迁央,還可以寫信息到文件里面去,如果你使用這個(gè)jar的時(shí)候滥崩,獲取ID3V1出現(xiàn)亂碼了岖圈,你需要修改的是org.farng.mp3.id3.ID3v1_1或者org.farng.mp3.id3.ID3v1里面的read方法,默認(rèn)里面是ISO-8859-1不是適合所有人的钙皮,比如我就改成了GBK蜂科。? ? ? ? ? 如果你使用這個(gè)jar來獲取ID3V2顽决,那么就需要對org.farng.mp3.object.AbstractMP3Object這個(gè)文件做修改,他里面的readByteArray(byte[] arr, int offset)這個(gè)方法解析我的音樂文件崇摄,都是亂碼(可能別人可以使用)擎值,具體改動是把里面的方法內(nèi)容替換成以下:

String charset;

int charcode = arr[0];//獲取編碼標(biāo)志?

if ( charcode == 0 ){

charset = "GBK";

}else if ( charcode == 3 ){

charset = "UTF-8";

}else{

charset = "UTF-16" ;

}

try {

String con = new String(arr, 1, arr.length - 1, charset);//編碼

//這以下都是為了解碼不錯(cuò)而寫的逐抑,沒有依據(jù)

offset--;

if (offset >= con.length()) {

offset = con.length() - 1;

}

if (offset < 0) {

offset = 0;

}

if ((offset == 0) && (con.length() == 0)) {

con = " ";

}

//這以上都是為了解碼不錯(cuò)而寫的,沒有依據(jù)

readString(con, offset);//jar里面 的方法

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

修改后以后屹蚊,重新打包成jar厕氨,就可以使用這個(gè)新的jar了。

(2)如果你使用第二個(gè)網(wǎng)絡(luò)資源汹粤,這個(gè)資源只有一個(gè)java文件命斧,也比較簡單,只是解析了V2.如果我們需要全面一點(diǎn)嘱兼,讓他也可以解析V1国葬,就需要對他做改動

這個(gè)文件里面有一個(gè)parse方法,這個(gè)方法里面有一段如下:

if( headerbuf[0] !='I'|| headerbuf[1] !='D'|| headerbuf[2] !='3'){

? ? ? ?file.close();

? ? ? ?returnfalse;

}

這一段是為了判斷是不是V2(如果是V2的話芹壕,開頭三個(gè)字符應(yīng)該是ID3汇四,另,V1部分開頭三個(gè)字符是TAG)踢涌,從上面的代碼可以看出通孽,如果不是V2,就直接結(jié)束了睁壁,而我們想要的是背苦,如果不是V2,我們就再去試試潘明,是不是V1行剂,如果也不是V1,那么我們只好把作者啊專輯啊钳降,都寫成未知了厚宰。所以,我們在file.close();前面加一個(gè)方法getID3V1(file);

方法內(nèi)容如下(從網(wǎng)上拷貝的):

private void getID3V1(RandomAccessFile file) {

byte[] buf = new byte[128];// 初始化標(biāo)簽信息的byte數(shù)組

try {

file.seek(file.length() - 128);// 移動到文件MP3末尾

file.read(buf);// 讀取標(biāo)簽信息

file.close();// 關(guān)閉文件

} catch (FileNotFoundException e) {

e.printStackTrace();

}// 隨機(jī)讀寫方式打開MP3文件

catch (IOException e) {

e.printStackTrace();

}

if (buf.length != 128) {// 數(shù)據(jù)長度是否合法

try {

throw new Exception("MP3標(biāo)簽信息數(shù)據(jù)長度不合法!");

} catch (Exception e) {

e.printStackTrace();

}

}

String tag = "";

try {

tag = new String(buf, 0, 3, "gbk");

} catch (UnsupportedEncodingException e1) {

e1.printStackTrace();

}

if (!"TAG".equalsIgnoreCase(tag)) {// 標(biāo)簽頭是否存在

try {

throw new Exception("MP3標(biāo)簽信息數(shù)據(jù)格式不正確!");

} catch (Exception e) {

e.printStackTrace();

}

}

try {

m_title = new String(buf, 3, 30, "gbk").trim();

m_artist = new String(buf, 33, 30, "gbk").trim();// 歌手名字

m_floder = new String(buf, 63, 30, "gbk").trim();// 專輯名稱

m_tyer = new String(buf, 93, 4, "gbk").trim();// 出品年份

m_comm = new String(buf, 97, 28, "gbk").trim();// 備注信息

System.out.println("作者:" + m_artist);

System.out.println("標(biāo)題:" + m_title);

System.out.println("專集:" + m_floder);

System.out.println("音軌:" + m_trck);

System.out.println("年代:" + m_tyer);

System.out.println("類型:" + m_tcon);

System.out.println("備注1:" + m_comm);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

當(dāng)然從我貼的代碼可以看到牲阁,我又使用了GBK編碼固阁,這個(gè)資源2里面的有一個(gè)方法parseTextField里面也有ISO-8859-1,在我這邊城菊,我也改成了GBK备燃,然后可以使用。

總結(jié)下凌唬,網(wǎng)絡(luò)上面的資源其實(shí)很多并齐,但是很亂漏麦,比如我們想要找一個(gè)可以解決編碼問題的資源,你不會那么巧况褪,剛剛好就找到了你想要的撕贞,你需要有耐心,慢慢找测垛,一個(gè)個(gè)的測試捏膨,最后你覺得最靠譜的方法,你再去不斷的調(diào)試食侮,不斷的修改号涯。最終肯定能把資源變成適合你的資源。

本文和上一篇文章使用的是一個(gè)項(xiàng)目

地址:http://download.csdn.net/detail/xiaodousa/9618128

其實(shí)這次經(jīng)歷中有很多不明白的地方锯七,比如链快,int charcode = arr[0];//獲取編碼標(biāo)志?

以及offset是否有什么依據(jù)眉尸,望大神指教

以上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末域蜗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子噪猾,更是在濱河造成了極大的恐慌霉祸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畏妖,死亡現(xiàn)場離奇詭異脉执,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)戒劫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門半夷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迅细,你說我怎么就攤上這事巫橄。” “怎么了茵典?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵湘换,是天一觀的道長。 經(jīng)常有香客問我统阿,道長彩倚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任扶平,我火速辦了婚禮帆离,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘结澄。我一直安慰自己哥谷,他們只是感情好岸夯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著们妥,像睡著了一般猜扮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上监婶,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天旅赢,我揣著相機(jī)與錄音,去河邊找鬼压储。 笑死鲜漩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的集惋。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼踩娘,長吁一口氣:“原來是場噩夢啊……” “哼刮刑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起养渴,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤雷绢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后理卑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翘紊,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年藐唠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帆疟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宇立,死狀恐怖踪宠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妈嘹,我是刑警寧澤柳琢,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站润脸,受9級特大地震影響柬脸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毙驯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一倒堕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尔苦,春花似錦涩馆、人聲如沸行施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾号。三九已至,卻和暖如春涯雅,著一層夾襖步出監(jiān)牢的瞬間鲜结,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工活逆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留精刷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓蔗候,卻偏偏與公主長得像怒允,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子锈遥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法纫事,類相關(guān)的語法,內(nèi)部類的語法所灸,繼承相關(guān)的語法丽惶,異常的語法,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,807評論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理爬立,服務(wù)發(fā)現(xiàn)钾唬,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 2017年5月17日 Kylin_Wu 標(biāo)注(★☆)為考綱明確給出考點(diǎn)(必考) 常見手機(jī)系統(tǒng)(★☆) And...
    Azur_wxj閱讀 1,803評論 0 10
  • 今天在看一個(gè)開源項(xiàng)目的時(shí)候侠驯,發(fā)現(xiàn)作者使用一個(gè)ssdb的數(shù)據(jù)庫抡秆,第一反應(yīng)是ssd硬盤,當(dāng)時(shí)很詫異陵霉。后面了解后才知道琅轧,...
    若與閱讀 8,663評論 4 7