Java讀取MP3信息2005/01/11 作者:梁夏峰 心情:
|
| 特征 | JLayer | JLayerME |
| JVM | J2SE | J2SE, J2ME |
| 音頻支持 | MPEG 1/2/2.5 Layer 1/2/3 | MPEG 1 Layer 3 |
| 內(nèi)存 | 1380KB to 1900KB | 760KB to 1280KB |
| JAR大小 | 105KB | 46KB |
| License | LGPL | LGPL |
| 狀態(tài) | Stable | Beta |

圖中上面部分:Plugins是一套獨(dú)立的部件,基于JLayer API,Mpeg音頻SPI插件實(shí)現(xiàn)了JavaSound1.0 的服務(wù)接口,使Mpeg音頻格式的開發(fā)者也能象操作播放WAV一樣方便。
在圖中下面部分,是應(yīng)用開發(fā)層,其中Core部分是JLayer提供的Mpeg音頻解碼,而jlApps是一個(gè)輕量級(jí)的用于提供給用戶使用的部分,即用戶界面、控制臺(tái)和播放列表等等部分,其中Convert是個(gè)小工具,可以把MP3轉(zhuǎn)換成WAV,但目前暫時(shí)還沒提供WAV到MP3的轉(zhuǎn)換。
下載JLayer1.0并解壓后,只需要修改它的build-win32.bat,指定正確的JAVA_HOME和JL變量,分別是jdk的目錄和JLayer所在的目錄,這樣就可以編輯src目錄下的源碼了,運(yùn)行build-win32.bat即可完成編譯和打包等工作。
使用下面的命令運(yùn)行播放MP3:
java -cp .\classes; javazoom.jl.player.jlp vincent.mp3
簡單分析:
程序的入口是javazoom.jl.player.jlp,一個(gè)基本的操作過程如下:
1、把mp3播放文件加載到InputStream;
2、生成AudioDevice,聲音設(shè)備;
3、生成Player,一個(gè)具體的播放器;
4、通過Player.play()進(jìn)行歌曲播放。
歌曲在JLayer里處理是被分成一個(gè)個(gè)的Frame,連續(xù)對(duì)Frame進(jìn)行解碼和播放,直到歌曲播放完畢。
下面接下來繼續(xù)講述高級(jí)問題,即我們都知道每首MP3歌曲里都帶有一些屬性如標(biāo)題、歌手、專輯等等,我們來看看怎么把這些內(nèi)容解析出來:
1、需要類包:mp3spi1.9.1.jar、tritonus_share.jar,可以下載jlGui2.3項(xiàng)目的壓縮包,解壓后在它的lib包里得到,copy到上面JLayer項(xiàng)目的目錄下,也可以在下面回帖并寫上email,我盡快給你發(fā);
2、修改build-win32.bat,把下面2段:
cd %JLSIMPLEPLAYER%
javac -classpath %JL%\classes -d %JL%\classes *.java
>>> 改為 >>>:
cd %JLSIMPLEPLAYER%
javac -classpath %JL%\classes;%JL%\tritonus_share.jar; -d %JL%\classes *.java
即在編譯時(shí)增加tritonus_share.jar的路徑;
3、在src\javazoom\jl\player\里編輯 jlp.java,用文本編輯即可;
4、增加如下類包:
| import javazoom.jl.decoder.*; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioSystem; import org.tritonus.share.sampled.file.TAudioFileFormat; import java.util.*; import java.io.*; |
5、main的方法里,在“player.play(); ”之前增加:
| File ff = new File(player.fFilename); AudioFileFormat aff = AudioSystem.getAudioFileFormat(ff); loadInfo(aff); aff = null; ff = null; |
即打印MP3的資料;
6、jlp類增加方法 loadInfo 如下,主要用于打印MP3的參數(shù):
| protected static void loadInfo(AudioFileFormat aff) throws Exception { System.out.println("[MP3 info] ---------------------"); String type = aff.getType().toString(); if (!type.equalsIgnoreCase("mp3")) throw new Exception("Not MP3 audio format"); if (aff instanceof TAudioFileFormat) { Map props = ((TAudioFileFormat) aff).properties(); System.out.println("title: "+props.get("title")); System.out.println("author: "+props.get("author")); System.out.println("album: "+props.get("album")); if (props.containsKey("mp3.mode")) { String channelsMode = ""; int mode = ((Integer)props.get("mp3.mode")).intValue(); if (mode==0) channelsMode = "Stereo"; else if (mode==1) channelsMode = "Joint Stereo"; else if (mode==2) channelsMode = "Dual Channel"; else if (mode==3) channelsMode = "Single Channel"; System.out.println("mode: "+channelsMode); } System.out.println ("channels: "+props.get("mp3.channels")); System.out.println ("rate: "+props.get("mp3.frequency.hz")); System.out.println("nominalbitrate: "+ props.get("mp3.bitrate.nominal.bps")); System.out.println ("layer: "+props.get("mp3.version.layer")); if (props.containsKey("mp3.version.mpeg")) { String version = (String) props.get("mp3.version.mpeg"); if (version.equals("1")) version = "MPEG1"; else if (version.equals("2")) version = "MPEG2-LSF"; else if (version.equals("2.5")) version = "MPEG2.5-LSF"; System.out.println("version: "+version); } System.out.println("crc: "+props.get("mp3.crc")); System.out.println("vbr: "+props.get("mp3.vbr")); System.out.println ("copyright: "+props.get("mp3.copyright")); System.out.println ("original: "+props.get("mp3.original")); System.out.println ("date: "+props.get("date")); System.out.println ("duration: "+props.get("duration")); System.out.println ("genre: "+props.get("mp3.id3tag.genre")); System.out.println ("track: "+props.get("mp3.id3tag.track")); } } |
6、以上存盤,運(yùn)行build-win32.bat,進(jìn)行自動(dòng)編譯、打包;
7、在JLayer項(xiàng)目的目錄路徑下,再用命令運(yùn)行播放MP3:
java -cp .\classes; javazoom.jl.player.jlp vincent.mp3
這時(shí)候會(huì)發(fā)現(xiàn)MP3內(nèi)帶的不少資料已經(jīng)打印出來,大功告成!

最后需要注意的是,以上都是以英文mp3來調(diào)試的,在中文歌曲方面,還有些特性需要處理,包括上面使用的mp3spi1.9.1.jar也有需要調(diào)整的地方,如各位有興趣,請(qǐng)深入這個(gè)問題吧 :)
相關(guān)資源:
http:///projects/javalayer/
|
|