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