在剛開始編碼的時候,不知道從何下手,由于寫YOYOPlayer之前用JMF寫過一個類似的播放器,但是由于要安裝JMF并且還需要另外安裝MP3 plugin,總體來說不太方便,并且JMF的項目也是Sun的一個已經(jīng)停止維護的項目了,并且用JMF有一個非常不好的地方,那就是經(jīng)常會在播放的時候crack掉,我以前用JMF寫的netbeans音樂插件就會出現(xiàn)這種問題,有時候音樂播得好好的,就突然netbeans退出了,基于這些考慮,所以放棄了使用JMF做為音樂播放框架的想法.
由于JAVA一個開源的開放的自由平臺,很多自由開源軟件應運而生,在音頻播放領(lǐng)域,Jlayer是一個很不錯的開源音頻播放組件,并且它下面還有一個純JAVA的音樂播放器叫jlGui,這個播放器,在我05年初學JAVA的時候就下載過,試用過,不過那個時候似乎不支持播放MP3格式的音樂,所以我也沒有當回事,現(xiàn)在jlGui算是挺強大的了,YOYOPlayer就是基于jlGui的架構(gòu)上寫的, jlGui的地址:http://www.javazoom.net/jlgui/jlgui.html,初看起來似乎YOYOPlayer和jlGui很像哦,呵呵,但是當你用了YOYOPlayer以后,你就會發(fā)現(xiàn)其實里面并不是很像,如果jlGui很好用的話,我就沒必要寫一個YOYOPlayer了,我直接寫一個歌詞插件就行了,何必重寫呢?主要原因是一,jlGui對中文支持不好,二,jlGui的面板設(shè)計不太好,不能分成幾個部份自由拖動,三,不支持多個播放列表,另外它的配置也很少.所以YOYOPlayer才正式?jīng)Q定要寫下去了,為了一個比jlGui更易用的JAVA版的音樂播放器,也為了更支持中文,并且支持同步的歌詞顯示.
確定了主要的框架以后,我花了一段時間去研究jlGui的源碼,發(fā)現(xiàn)有些地方寫得不太如意,一開始,我的項目是直接引用BasicPlayer.jar這個包的,后來里面有些東西寫得確實不太好,所以才把BasicPlayer.jar里面的源文件拿出來,自己重新修改放到自己的項目里面去,并且它的日志都是英文的,還有一點它的日志是用log4j的,而我的日志系統(tǒng)用的是java.util.logging,所以把該改的代碼都改過來了.
由于我以前寫的歌詞組件是基于JMF的,是主動取得歌詞時間,而jlGui里面要得到時間只有被動的實現(xiàn)接口去得到,直到YOYOPlayer1.1都是這樣得到媒體的時間的,現(xiàn)在正在改進的版本中已經(jīng)改過來了,變被動接受時間為主動詢問時間,這樣對于控制歌詞的刷新速度有了更好的主動性.并且效果也有所提高,因為一個接口實現(xiàn)方法里面做太多的事情會影響事件派發(fā)線程派發(fā)的及時性以及效率..
我以前曾經(jīng)寫過ID3v1格式的標簽的讀取,后來發(fā)現(xiàn)jlGui里面有一個讀取ID3標簽的庫,為了統(tǒng)一性,就使用了它的庫,結(jié)果它的庫讀出來的中文都是亂碼,于是我又得改源代碼,把讀出來的字符串全部根據(jù)配置進行轉(zhuǎn)碼,才不致于出現(xiàn)中文亂碼的情況,在后來又發(fā)現(xiàn)一個非常好用的歌曲標簽讀取庫叫jaudiotagger,地址是:
http://www.jthink.net/jaudiotagger/index.jsp,但是那個庫又沒有APEv2格式的標簽讀取支持,于是我只得自己寫了一個APEv2格式的標簽讀寫器,并集成到同一個庫里面,便于管理.把jaudiotagger庫集成進來以后,又對jlGui里面的標簽讀取的方式進行了改動,以增加標簽指定編碼的讀和寫的功能.
在YOYOPlayer的界面上,很多地方是參考了千千靜聽,甚至說就是千千靜聽的設(shè)置直接搬過來的,因為千千靜聽是一個很成功的音樂播放器,成功的地方我們就要去學習,并且它確實有很多地方值得我們學習的,無論是從易用性還是擴展性來講都是一樣.YOYOPlayer的整體就是這個樣子,下次我們來根據(jù)代碼說話,和大家一起分享在編碼的過程中遇到的快樂和痛苦.希望能對大家有些幫助.也希望大家對于YOYOPlayer提出更多的意見,等java.net上的項目通過以后,有更多的人加入到開發(fā)YOYOPlayer的行列中來.
盡管千里冰封
依然擁有晴空
你我共同品味JAVA的濃香.
posted on 2008-01-08 20:11
千里冰封 閱讀(7755)
評論(12) 編輯 收藏 所屬分類:
JAVASE