Java课程设计音乐播放器设计.doc
《Java课程设计音乐播放器设计.doc》由会员分享,可在线阅读,更多相关《Java课程设计音乐播放器设计.doc(30页珍藏版)》请在沃文网上搜索。
1、目录1 程序功能描述32 开发环境描述33 开发技术介绍34 详细设计44.1功能模块划分44.2 用户界面设计54.2.1 歌曲列表面板54.2.2 播放控制面板84.2.3 搜索及展示面板84.3 播放功能实现94.3.1播放歌曲94.3.2 暂停及继续播放114.3.3 音量控制124.3.4 播放模式124.3.5 时间进度条134.4 歌词展示实现144.4.1 加载歌词文件144.4.2 解析歌词文件144.4.3 展示歌词154.5 搜索网络歌曲资源164.5.1 获取HTML文本164.5.2 解析HTML文本184.5.3 抓取数据描述204.6 网络歌曲资源处理204.6.
2、1 歌曲资源的载体204.6.2 歌曲资源的操作244.7 程序内置的游戏264.7.1 2048264.7.2 贪吃蛇274.7.3 五子棋275程序运行286 实验小结301 程序功能描述音乐播放器是一种用于播放各种音乐文件的多媒体播放软件。我们以酷狗音乐播放器的操作界面为原型,设计一个实现播放、搜索、下载歌曲的Java音乐播放器。此音乐播放器支持音乐格式较少,只有MID、WMA、MP3。最后,为音乐播放器置入一些游戏,增强播放器的娱乐性。2 开发环境描述IDE:Eclipse(Luna)、netbeansJDK:1.8图片处理:Photoshop3 开发技术介绍1)Java Sound
3、:Java Sound API是Java SE平台提供底层的处理声音接口。使用Java Sound API可以实现各种基于声音的应用,例如声音录制、音乐播放、音乐编辑等。同时其还提供了第三方的扩展接口(SPI),实现各种音乐格式的解码与转码。2)Java Zoom :为了支持MP3的播放,必须为JavaSound扩展MP3的SPI支持库。开源项目JavaZoom正是提供了一个兼容JavaSound的纯Java解码器。引用:jl1.0.1.jar、mp3spi1.9.5.jar、tritonus_share.jar3)Jaudiotagger :开源项目Jaudiotagger提供一个Java类
4、库用于编辑音频文件的tag信息(附有此音频的歌手、标题、专辑、音轨长度等的信息)。引用:jaudiotagger-2.0.3.jar4)Jsoup :Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API。引用:jsoup-1.8.1.jar5)Substance:Swing自带提供了几种look and feel类,然而要设计一个非常精美的GUI界面,却相当麻烦。使用java substance可以很简单地实现。Substance里面有很多现成的非常漂亮的皮肤。引用:substance.jar4 详细设计4.1功能模块划分按结构
5、化设计方法,划分出四个功能模块:歌曲列表、播放控制、搜索及音乐库。此四个模块正好对应酷狗用户界面的四部分。酷狗音乐播放器如下:Figure 4.1.1 Kugou程序构建的包main:主入口ui、ui.tool:用户界面及其使用的一些工具类song:包含有歌曲、歌词信息的类player:播放相关的类search:搜索相关的类程序结构图如下:Figure 4.1.2 程序结构图4.2 用户界面设计窗体(Frame):窗体初始大小为975*670;内容面板(ContentPane)由播放面板(PlayPanel)、歌曲列表面板(PlayListPanel)、搜索面板(SearchPanel)、展示
6、面板(ShowPanel)构成,内容面板的布局采用的是BoxLayout+Box,PlayListPanel和SearchPanel对应都绑定了一个工具条(ButtonToolBar)程序引用了外包Substance 设计观感4.2.1 歌曲列表面板PlayListPanel由一个工具条(ButtonToolBar extends JToolBar)、JPanel构成,其中JPanel采用CardLayout布局,JPanel加入了3个歌曲列表面板(SongListPanel extends JScrollPanel)、1个应用面板(JScrollPanel)利用工具条的按钮切换显示面板Fig
7、ure 4.2.1 1 歌曲目录歌曲列表面板(SongListPanel)-列表的实现: 利用JTree实现二级目录。顾名思义,JTree是树状元件,它由众多节点构成,其中JTree需要一个根节点(root)。关于节点,我们用可派生节点DefaultMutableTreeNode类(implements TreeNode ) 即这种节点可以做“树干”也可以做“叶子”1)利用一个节点构建一个JTree,该节点为根节点,即一级节点其实我们要实现的歌曲列表是3级节点:根节点、歌曲目录、歌曲文件,这里我们需要隐藏点根节点:tree.setRootVisible(false); 否则我们将看到3层目录2
8、)根节点加入节点歌曲目录节点(rootNode.add(aNode))第2级节点为歌曲目录,可派生歌曲节点:节点(TreeNode)的其中一个构造器是接受Object对象userObjectJTree是以节点的toString方法返回的字符串显示节点,而节点的toString是由UserObjcet的toString决定,所以用String来构建歌曲目录节点即可3)歌曲目录节点应该有一个计算当前歌曲数目并在目录中显示的方法目录节点计算其的子节点数,并更新到目录名4)歌曲目录节点加入歌曲文件节点加入方法与上面一样。这里每个歌曲(File)是一个节点,不可派生子节点上面说到每个节点在JTree显示
9、的字符串,都是由该节点的UserObject.toString()决定,File的toString返回的是该文件的路径,这里我们重写DefaultMutableTreeNode的toString 让它返回歌曲名,所以构造了SongNode类(extends DefaultMutableTreeNode)5)弹出菜单再做下面各种操作前,需要一个使用载体,我们利用弹出菜单来实现Figure 4.2.1 2 弹出菜单6)移除歌曲目录因为用户只能选中第2、3级节点,这里需要判断当前选中的是第几级节点:获取选中的路径TreePath path = tree.getSelectionPath()(如果pa
10、th=null 可以不往下执行),通过path.getPathCount()来判断,第3级节点是返回值是3。如果是第3级节点,需获得它的上级节点(即歌曲目录)获取末端组件DefaultMutableTreeNode node=(DefaultMutableTreeNode) path.getLastPathComponent()获取上级节点DefaultMutableTreeNode aList=node. getParent()如果是第2级节点,可直接获取选中路径的末端组件aList=(DefaultMutableTreeNode)path.getLastPathComponent();这样
11、保证都从歌曲目录节点操作,再按以下次序进行判断:1.如果当前目录是默认目录,不移除,可以通过当前节点在根节点的位置判断root.getIndex(aList)2.如果当前目录含有歌曲,进行提示是否移除,可以获取该目录节点的子节点数目(getChildCount)或者该节点是否为“叶子”(isLeaf)3.如果当前目录播放着歌曲,终止播放,这里后面再叙述。4.最后移除,aList .removeFromParent();7)清空歌曲目录与移除目录类似,最后清空使用的方法aList.removeAllChildren();8)删除歌曲可以参考移除目录的实现,需要注意的是,要保证当前选中的节点是第3
12、级节点,即歌曲文件,是第2级节点就不往下操作,删除方法同样是aSong. removeFromParent()9)获取音频文件通过JFileChooser打开个对话框,获取外部文件,并给其安装过滤器。过滤器过滤出的格式为mid,mp3,wav选择文件分为两种模式,1获取多个音频文件,2获取一个文件夹。需设置JFileChooser的选择模式setFileSelectionMode(int param)关于第2种模式,获取了文件夹后,也要给文件夹进行过滤操作(直接判断或者安装过滤器)这里的过滤器是抽象类 FileFilter,这里定义了一个AFilter(extends FileFilter)最
13、后将这些files加入目录节点即可10)鼠标右击选中当前节点给JTree注册MouseListener.,先判断是否鼠标右击,再取与点击点坐标最近的节点tree.getPathForLocation(int x, int y)应用面板(AppPanel)的实现:应用面板用JScrollPane,加入多个按钮,一个按钮对应着Expandsion包附加的小游戏程序(Expandsion包导出游戏程序后,被删除)以上,歌曲列表面板界面基本实现,注意每次对JTree操作后,请更新JTree的状态,tree.updateUI(),否则有可能出现Bug。在我们实现歌曲播放面板操作功能时,与歌曲列表面板进行
14、交互,会再往列表面板添加功能。4.2.2 播放控制面板PlayPanel由于Java Swing布局复杂,我们可以用Eclipse的WindowBuilder或者netbeans的Matisse可视化构建PlayPanel由以下组件构成标签:歌曲名(songNameLabel)当前播放进度时间(currentTimeCountLabel) 当前播放歌曲总时间(audioTotalTimeLabel)按钮:上一首(backPlay)下一首(frontPlay)播放(Play)静音(voiceControl) 下载(download)标记(mark)分享(share)这里用到的按钮,都用到图片;为
15、简化代码,构建一个IconButton来定义上面的按钮其它:组合框(JComboBox) mode控制播放模式 滑块条(JSlider) voiceAdjust控制音量进度条(TimeProgressBar) 这里用到的进度条timerProgressBar 由于要计时,所以也构建一个TimeProgressBarFigure 4.2.2 2 播放控制面板4.2.3 搜索及展示面板SearchPanel/ShowPanel的布局可以参考PlayListPanel,这里说下折叠面板效果的实现(下图选中的按钮)折叠:SearchPanel/ShowPanel均设不可见,再设置Frame的大小和刷新
16、。展开:给Frame注册窗体状态监听器,如果用户按了最大化按钮,会产生一个事件给监听器,这里判断当前窗体的新状态是否为最大化,然后与折叠操作类似。(也可以不用“最大化”按钮判断,可以设置一个新按钮作事件源) Figure 4.2.3 3 搜索及展示面板4.3 播放功能实现播放面板功能主要由BasicPlayer、HigherPlayer、TimeProgressBar,BasicPlayer实现的是底层操作(播放、暂停、继续播放、终止、获取音频总时间等)。HigherPlayer(extends BasicPlayer)处理面板间的交互,面板与BasicPlayer的交互。TimeProgre
17、ssBar绑定了一个Timer,作计时功能。4.3.1播放歌曲为实现播放功能,我们这里用了Java Sound API,它可以实现各种基于声音的应用。Java Sound API的输入/输出相当于IO流,TargetDataLine/SourceDataLine接口对应输入/输出设备,要得到这个设备的对象,需要设备信息:它是输入还是输出设备,它处理的音频数据格式-即编码格式,不是“WAV/MP3”等文件格式AudioSystem在此过程中起着工厂类的作用这里先关注SourceDataLine如何实现播放功能:BasicPlayer中关于播放的属性private AudioInputStream
18、 audioInputStream;public SourceDataLine sourceDataLine;public URL audio;public Thread playThread;1)获取audio URL回到SongListPanel,在JTree已注册的MouseListener里增加响应mouseClicked的处理,进行判断,选取第3级节点。HigherPlayer在load方法里获取这节点的userObect(即File),再转成URL,这里在HigherPlayer,议保存这个节点,因为节点很容易获取它所在的列表节点。2)从指定的URL获取音频输入流及音频编码格式先获
19、取音频输入流AudioSystem.getAudioInputStream(audio),再获取其音频编码格式audioInputStream.getFormat()Javax.Sound默认支持的编码格式有PCM_SIGNED、PCM_UNSIGNED、ALAW、ULAW,对于这些编码格式我们都不这么了解,只知道WAV与MID采用的是PCM_SIGNED当要播放MP3档时,这里会报异常,因为Javax.Sound并不支持MPEG1L3编码(MP3采用此格式编码)3)将MPEG1L3编码转换成PCM_SIGNED首先要扩展Javax.Sound的解码能力,之后再进行转码。Javax.Sound
20、除了有实现声音处理的API外,同时它以SPI(服务提供接口)为基础,实现各种音乐格式的解码与转码,SPI以插件形式扩展了音频处理的能力,SPI随程序启动而被启动。即我们只要给程序引入MP3的SPI支持库,这里用到的第3方支持库是JavaZoom,获取其中的jl1.0.jar、mp3spil1.9.5.jar、tritonus_share.jar因为程序解码能力扩展,所以上面不再报异常,接着往下转码/ MPEG1L3转PCM_SIGNEDif (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) audioFormat =
21、new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,audioFormat.getSampleRate(), 16,audioFormat.getChannels(),audioFormat.getChannels() * 2,audioFormat.getSampleRate(), false);audioInputStream = AudioSystem.getAudioInputStream(audioFormat,audioInputStream);这里将audioFormat audioInputStream分别转换成PCM_SIGNED,
22、对于此转码方法,我们作了搬运工4)获取输出设备信息及对象/根据上面的音频格式获取输出设备信息DataLine.Info info = new Info(SourceDataLine.class, audioFormat);/获取输出设备对象sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);这里sourceDataLine extends Line5)打开输出数据管道并进行IO操作打开输出管道sourceDataLine.open();允许此管道执行数据 I/O sourceDataLine.start();到这里,我们从输入
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 课程设计 音乐 播放 设计
