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唤醒。
歌词滚动:(歌词焦点在第一行)
当计时器到一定秒数,要显示歌词时,将第一行歌词剪去,整体上移,第一行歌词就是当前时间对应的歌词,再显示最后一行歌词的下一句歌词。


主要代码

用户登录、注册

用户创建账号注册、登录

主要代码

项目总结

 posted on 2020-01-09 23:32  张瑀鑫  阅读(3061)  评论(4编辑  收藏  举报