昌攀 陳姚節(jié) 葛程 方志
摘要:本文論述了采用Java語言開發(fā)一種基于C/S架構(gòu)的音樂播放器,利用JMF(Java Media Framework)實現(xiàn)播放功能。該播放器除實現(xiàn)普通播放器的功能外,其亮點在于可以自動或手動下載歌詞并保存,并且可以自動進行歌詞同步。該播放器設(shè)計界面簡潔,功能強大,并且占用內(nèi)存小,執(zhí)行速度快。
關(guān)鍵詞:音樂;JMF;播放器
中圖分類號:TS954 文獻標(biāo)志碼:A 文章編號:1674-9324(2014)49-0072-03
隨著因特網(wǎng)在我國的普及,隨之而來的是各式各樣的播放器軟件。盡管未來的音樂播放器將具備各種豐富多彩的功能,但作為一款多媒體軟件,音頻應(yīng)用才是最基本的,也是最能決定獲取用戶數(shù)量的因素。 基于上述分析,音質(zhì)高、外形美觀、小巧且功能強大是未來播放器發(fā)展的主流趨勢。Java MP3音樂播放器的播放歌曲的功能是通過JMF這個jar包里面的MediaPlayer來實現(xiàn),它的play和stop方法分別實現(xiàn)播放和暫停功能,該播放器由歌曲控制模塊、歌曲列表模塊和歌詞顯示模塊三部分組成。該播放器采用客戶端/服務(wù)端(C/S)設(shè)計模式,利用“千千靜聽”歌詞服務(wù)器作服務(wù)端,以Myeclipse 10.0作為開發(fā)環(huán)境。
一、播放器界面的實現(xiàn)效果
該界面清晰明了,采用Java的界面編輯技術(shù),控件簡約,所消耗的系統(tǒng)資源較少,運行高效快速。值得改進的地方是:可以在歌詞的背景處加上背景圖片,功能不是很齊全,等等。
二、播放器的基本功能
結(jié)合音樂播放器所要實現(xiàn)的內(nèi)容,我們列出用戶操作的模塊,其中每個模塊對應(yīng)一個功能。播放器的功能應(yīng)當(dāng)實現(xiàn)市面上比較常見播放器的所有功能,并且在界面上應(yīng)當(dāng)操作簡單,還應(yīng)添加一些比較特殊的功能,比如歌詞下載。經(jīng)過分析后確定該播放器應(yīng)具備的功能如圖2所示。
三、關(guān)鍵技術(shù)以及改進方法
該論文所描述的播放器采用多線程來進行控制,一個主頁面是一個線程,播放歌曲是一個線程。主線程就是主頁面所處的線程,它動態(tài)的對歌曲名稱、播放時間、播放進度和歌詞顯示來進行更新。播放歌曲的線程是一個位于主線程里的一個進程,控制這個進程的開始和結(jié)束來影響主線程里數(shù)據(jù)的讀寫和顯示,所以對于線程的控制是必要的。
1.播放功能模塊以及界面的設(shè)計。歌曲控制面板視圖如圖3所示。播放、暫停和停止都依賴于主線程中的三個控制boolean變量,一個是play,另一個是pause,第三個是stop。初始值:stop=true,play=false,pause=false。
播放、暫停、停止功能的具體實現(xiàn)。當(dāng)play和pause都為false的時候,此時只能通過雙擊控制實現(xiàn),雙擊之后會啟動一個歌曲播放的進程,用來控制歌曲的具體播放動作。當(dāng)歌曲的狀態(tài)是暫停時,就可以繼續(xù)點擊暫停按鈕,達到播放的效果。此時,無需重新新建一個線程,只需讓原來暫停的線程重新啟動,同時需要改變變量stop和play。當(dāng)然,還需要考慮到主線程,當(dāng)play的狀態(tài)為true時,主線程才能跑的順利。停止只有在stop為false時起作用,與pause和play無關(guān),即無論歌曲是暫停還是播放,都可以選擇停止。首先就是把musicprocess線程停止,然后就需要把stop的狀態(tài)改為true,還有需要把play的狀態(tài)改為false,這樣做的作用是控制主線程不要一直run,然后還需要把歌曲的播放時間設(shè)置為0:00,這樣就基本實現(xiàn)了歌曲的停止功能。
2.基本操作模塊的實現(xiàn)。①上一曲和下一曲的實現(xiàn)也是通過按鈕來實現(xiàn)的。當(dāng)歌曲播放狀態(tài)為停止,亦及stop狀態(tài)為true時,是不能進行上下一曲操作的。但是,當(dāng)歌曲處于暫?;蛘卟シ艩顟B(tài),這個操作都是可以完成的。特別需要注意邊界的問題,最重要的還是實現(xiàn)了自動滾動條定位的功能。首先判斷歌曲播放的狀態(tài),不是停止?fàn)顟B(tài),才會導(dǎo)致上下一曲功能生效,然后就是進行邊界判斷,邊界判斷之后,就需要原來播放歌曲的musicprocess線程停止掉,新建一個musicprocess線程,來播放新的歌曲,線程啟動后,play的狀態(tài)同樣得設(shè)置為true,這樣做是為了避免前面提到的,當(dāng)初始播放狀態(tài)為暫停時,點擊上下一曲歌曲還是暫停的情況。同時在主線程里面,需要將時間與歌曲總時間設(shè)置完成,并且需要將進度條也設(shè)置為初始位置,歌曲名稱也需要設(shè)置成新的歌曲名稱。下載歌詞、解析歌詞、同步歌詞,這其實都是連貫動作,下載前需要判斷是否存在歌詞,存在就不會再下載了。②快進、快退算的上是一個播放器的核心功能,快進、快退需要涉及到一個計算過程及歌曲播放時間和進度條之間的關(guān)系,還關(guān)聯(lián)到歌詞同步的問題。根據(jù)進度條的拉動距離和總的拉動距離之間的比例乘以總共的歌曲播放時間,就能算出歌曲應(yīng)該播放的時間,這樣就能設(shè)置出歌曲播放的時間,實現(xiàn)快進和快退的功能。其核心的代碼如下:
3.歌曲操作模塊的實現(xiàn)。①新增歌曲:該論文所描述的播放器新增歌曲功能除了能通過Java自帶的文件選擇器來進行歌曲添加操作,還有一種比較酷炫的是單個或者批量拖拽增加,以及拖動文件進入到歌曲列表就能夠完成新增功能。拖拽文件原理:給歌曲播放列表設(shè)置一個接口的實現(xiàn)類,這個接口里面的拖拽其實和文件選擇器的原理類似,這個實現(xiàn)類里面也做了文件篩選和文件格式過濾功能。②刪除歌曲:刪除歌曲功能與新增歌曲類似,也是有兩種途徑:一種是從程序控制面板中刪除按鈕,另一種是在歌曲列表中的右鍵事件里的刪除按鈕,刪除的原理就是從歌曲面板中和存儲歌曲絕對路徑的數(shù)組中刪除被選中的歌曲。但是與增加不同的是,在刪除歌曲的時候,要考慮被刪除的歌曲是否正在播放,已經(jīng)被刪除的歌曲是否是最后一首歌曲,如果不是,就自動播放下一首歌曲,如果是最后一首,就自動播放上一首歌曲。
4.歌詞功能模塊。①歌詞下載功能的實現(xiàn)依賴網(wǎng)絡(luò)上的資源。歌詞下載,首先就是要選擇好一個歌詞服務(wù)器——“千千靜聽”歌詞服務(wù)器。由于網(wǎng)絡(luò)環(huán)境是不支持中文的,所以“千千靜聽”服務(wù)器也做了必要的處理和轉(zhuǎn)換,它是利用歌手和歌曲名稱來轉(zhuǎn)碼,轉(zhuǎn)化為UNICODE編碼,進行歌詞的下載,由于頁面編碼采用的是UTF-8,所以下載時必須以UTF-8的編碼來進行文件的讀取。②解析歌詞:采用正則表達式匹配前面的內(nèi)容來判斷每一行的具體內(nèi)容。本播放器采用的是一個字符串存儲歌曲名、一個字符串存儲歌手、一個字符串存儲專輯名,用一個以時間為value的Map來存儲歌詞,這樣就成功的解析了歌詞。下面給出具體的正則表達式:
歌曲信息:str.startsWith("ti:")
歌手信息:str.startsWith("ar:")
專輯信息:str.startsWith("al:")
歌詞信息:\\[(\\d{2}:\\d{2}\\.\\d{2})\\]
③歌詞顯示:歌詞顯示利用的技術(shù)就是java里面的畫筆技術(shù),利用畫筆來繪畫歌詞。具體的繪畫技術(shù)利用的是Java繪畫中效果比較好的雙緩沖技術(shù)。先是把所有歌詞預(yù)畫到歌詞顯示面板,然后再逐行顯示當(dāng)前播放的歌詞。當(dāng)然,也要考慮到不存在歌詞文件的問題,由于歌詞文件不存在,所以得在主線程使用一個變量標(biāo)示是否存在歌詞,不存在歌詞,就直接顯示“未找到相應(yīng)的歌詞文件”。值得注意的是歌詞顯示的比率算法,歌詞顯示的比率是調(diào)節(jié)顯示歌詞的比率,即調(diào)節(jié)歌詞顯示的主鍵模糊度,具體的算法代碼如下表。 ④歌曲同步:詞曲同步的最初設(shè)想是開啟兩個線程:一個歌曲播放線程,另一個是歌詞顯示線程,然后把兩個線程同步,最后把歌詞顯示放在主線程中,這樣可以減少程序占用的資源,并且在詞曲同步的控制上面也可以提供很多方便。
四、測試結(jié)果
經(jīng)過測試,本論文中的播放器是一款小型、靈巧的播放器,更加適合多數(shù)人的意愿。而該音樂播放器占用內(nèi)存小、開啟速度快,很符合現(xiàn)在人們比較快的生活方式。
參考文獻:
[1][美]Nicholas C.Zakas.JavaScript高級程序設(shè)計[M].第3版.李松峰,曹力,譯.北京:人民郵電出版社, 2012.
[2][美]Freeman.E.Head First設(shè)計模式[M].OReilly Taiwan公司,譯.北京:中國電力出版社,2007.
[3]Chien-Hung Liu. Data flow analysis and testing of JSP-based Web applications[J].Information and Software Technology,2006,4812.
[4]Gary G.Yen,Brian Ivers.Job shop scheduling optimization through multiple independent particle swarms[J].International Journal of Intelligent Computing and Cybernetics,2009,(21).