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唤醒。
歌词滚动:(歌词焦点在第一行)
当计时器到一定秒数,要显示歌词时,将第一行歌词剪去,整体上移,第一行歌词就是当前时间对应的歌词,再显示最后一行歌词的下一句歌词。
主要代码
用户登录、注册
用户创建账号注册、登录
主要代码