101Player
1.團隊名稱、團隊成員介紹
團隊名稱:
陳玲清(組長)
- BasicPlayer HigherPlayer
- SongListPanel
- SongNode
- 實現對音頻的處理和播放
張瑀鑫(組員)
- HubFrame,PlayListPannel,PlayPanel,SearchPannel,ShowPannel
- ButtonToolBar,IconButton
-
- 主要負責GUI設計,面板之間的交互
蘇楚雯(組員)
- AFliter,LrcInfos,TimeProgressBar
- 對歌詞滾動,lrc歌詞文件處理,計時器
參考代碼:https://blog.csdn.net/huahuaxingjing/article/details/49047725
2.項目git地址
https://github.com/Salcious/101music
3.項目git提交記錄截圖
4.前期調查
- 歌詞面板
播放列表:歌曲播放記錄
進度條:歌曲播放進度
暫停/播放鍵:暫停歌曲、播放歌曲
音量進度條:調節音量
歌曲播放模式按鈕:切換循環播放、順序播放等
左右鍵:播放上一首/下一首
歌詞面板:歌詞滾動
5.項目功能架構圖、主要功能流程圖
- 程序主要結構
6.面向對象設計包圖,類圖
7.項目運行截圖或屏幕錄制。
8.項目關鍵代碼:模塊名稱-文字說明-關鍵代碼(注意:不得直接復制所有源代碼,僅粘貼最關鍵代碼)。
GUI設計部分
PlayPanel
面板包含:3個標簽,7個按鈕,1個進度條,1個組合框和1個滑塊條
主要代碼
Button的監聽器,這里主要展示play button
HubFrame
整合四個panel
面板包括:playPanel,playLisyPanel,searchListPanel,showPanel;
采用Boxlayout+Box
導入了Substance.jar包設計觀感,水印,渲染使swing界面更美觀
HubFrame包括一些panel之間的交互,例如PlayPanel和PlayListPanel之間,在PlayListPanel里選歌,PlayPanel中要有當前播放的歌名的體現,以及,ShowPanel中歌詞的滾動也與PlayPanel中的歌曲播放當前時間對應。
這里主要展示一個界面縮放的代碼
實現三種形式的界面
除了之前展示的界面,還包括以下兩種
音樂播放與列表部分
1. 對音源進行處理並嘗試播放
音源處理主要實現過程如下:
獲取URL:1.獲取音頻輸入流AudioSystem.getAudioInputStream(audio)。再通過getFormat方法獲取編碼格式
播放MP3:將MP3的編碼格式轉換成PCM_SIGNED用到第三方支持庫JZoom——其中的三個jar包:jl1.0.1 jar (播放音樂)MP3spi1.9.5 (支持mp3格式 )tritonus.jar(進行GSM編解碼)
(Java當中正常只能播放wav格式音樂)
獲取設備信息:根據音頻格式獲取設備信息
打開管道進行IO流操作
轉換編碼格式
2.音源線程的管理
正在播放中的歌曲則為新建的線程。如果暫停,則wait。繼續播放則notify。
如果切歌,則終止當前線程,並等待新建一個新的音樂播放線程。
3.音量控制
輸出設備對象sourceDataLine獲取控制方法
通過floatVoiceControl.setValue()設置音量
4. 獲取信息
5.歌曲列表的實現
SongListPanel :利用JTree(樹狀元件)實現多級目錄。節點則利用DefaultMutableTreeNode類
三級列表:根節點(隱藏),列表,文件
JTree 以節點的toString方法返回字符串顯示節點,用String來構建歌曲目錄節點
加入歌曲:歌曲文件的toString方法,返回該文件的路徑。構造SongNode類(繼承自DefaultMutableTreeNode),toString返回歌名
移除歌曲列表:
-
先判斷為第幾級目錄。根目錄不移除(root.getIndex(aList))
-
有子節點,則提示是否移除
-
刪除播放中的歌曲,暫停播放
-
移除
清空歌曲列表:
aList.removeAllChildren();
添加歌曲文件:
通過JFileChooser打開對話框,獲得外部文件,過濾(mp3,wav,mid)
定義文件File [] ,將files加入目錄節點
6.實現不同模式的播放(這里展示前后切歌)
過濾文件,進度條、歌詞滾動同步模塊
Afilter
添加歌曲文件時,過濾掉文件類型不是.mid .mp3 .wav的文件。
主要代碼
LrcInfors
解析歌詞文件lrc。歌手、標題、專輯解析分別是判斷該行字符串頭部是否對應[ar: 、[ti: 、[al: 。
歌詞解析則通過正則表達式匹配時間,對應時間格式的正則表達式為\[\d{2}:\d{2}\.\d{2}\] 。\d為0-9,{2}匹配兩次。timeList(List)存放每句歌詞對應的時間轉成的秒制,Infos(HashMap)存放歌詞對應的秒制時間和歌詞。
主要代碼
TimeProgressBar
綁定計時器Timer,播放歌曲前,初始化進度條的信息(setMinimum、setMaximum、timelength)重置Timer,啟動Timer。暫停歌曲,Timer阻塞。繼續播放,Timer喚醒。
歌詞滾動:(歌詞焦點在第一行)
當計時器到一定秒數,要顯示歌詞時,將第一行歌詞剪去,整體上移,第一行歌詞就是當前時間對應的歌詞,再顯示最后一行歌詞的下一句歌詞。
主要代碼
用戶登錄、注冊
用戶創建賬號注冊、登錄
主要代碼