小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java自由人 | Java讀取MP3信息

 fondofbeyond 2007-08-28

Java讀取MP3信息

2005/01/11  作者:梁夏峰   心情: sunny  星期二 (10:05)

現(xiàn)在有很多純Java開發(fā)的MP3播放器,早前就接觸過一個(gè)jlGui2.0,和WinAmp界面基本已經(jīng)接近,但在功能表現(xiàn)上還不是很理想,近幾天又推出最新2.3版本,已經(jīng)完成大部分WinAmp的功能,并且在功能的實(shí)現(xiàn)上還很不錯(cuò),這里先貼上一張實(shí)際運(yùn)行的界面,讓大家過過眼:

如果對(duì)比過jlGui2.0和2.3,大家可能會(huì)有很深的印象,之間在界面和功能上都有很大的差距,2.0還稱不上叫產(chǎn)品,但2.3已經(jīng)可以稱為比較專業(yè)的產(chǎn)品了,估計(jì)再往下開發(fā),大家都不一定再能認(rèn)出這是Java開發(fā)的MP3播放器 :)

由于播放器封裝的東西很多,所以想從淺往深了解不是很方便,現(xiàn)在就干脆找來底層開發(fā)MP3的Library:JLayer,可別小看它,下面列出了很多MP3開發(fā)的項(xiàng)目都是基于它為基礎(chǔ)的,把JLayer介紹過后,再來看看如何進(jìn)行高級(jí)功能的擴(kuò)展。

JLayer是一套Open Source的Java類庫,可以在不同的OS下使用,提供對(duì)MP3進(jìn)行實(shí)時(shí)解碼、轉(zhuǎn)換和播放。1.0版本在04年11月發(fā)布,支持MPEG 1/2/2.5、Layer 1/2/3 audio format,JLayer不需要JMF,此外JLayer不僅有J2SE版本,而且還提供J2ME版:JLayerMe,以提供在手機(jī)上進(jìn)行應(yīng)用開發(fā)。1.0版本在JRE5下的運(yùn)行速度快,消耗低(CPU僅消耗1%),下面列出采用JLayer為基礎(chǔ)的MP3項(xiàng)目:

jlGui ---------- MP3 player, WinAmp clone.
MP3SPI --------- MP3 plugin for J2SE.
JLayer C# ------ C# port of JLayer.
MP3View -------- JLayer Eclipse Plugin.
Plaberbu ------- Karaoke MP3 player.
jAmp ----------- Another WinAmp clone.
Human iPod ----- Halloween funny contest.
KJ Player ------ Cross-fading MP3 player
PartyJukeBox --- JukeBox player
JavaTunes ------ Another JukeBox player.
MediaChest ----- Media organizer.
LightDev ------- Spectrum Analyzer.

下面列表是J2SE版和J2ME版的比較:

 特征 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

下圖展示了JLayer提供項(xiàng)目支持的架構(gòu):

圖中上面部分: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/

http://www./jlgui/jlgui.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多