《基于java的mp3播放器的设计与实现毕业论文.doc》由会员分享,可在线阅读,更多相关《基于java的mp3播放器的设计与实现毕业论文.doc(27页珍藏版)》请在三一办公上搜索。
1、基于java的mp3播放器的设计与实现 摘 要:随着计算机和多媒体技术的不断发展以及个人计算机的普及,各种各样的媒体文件、媒体播放器层出不穷,而MP3(MPEG Audio Layer3)格式以其体积小、音质也有保证的特点成为使用最为广泛的音频格式,得到了绝大多数软件和硬件媒体播放器的支持,同时WAV格式作为无损的音频格式也独树一帜。如今,软件市场上的媒体播放器百花齐放,如:MediaPlayer,酷我音乐盒和千千静听等。高音质播放和低内存消耗是各种媒体播放器所追求的目标。 关键词:音乐播放器 java MVC JMF Ecplise 一、绪论1.1背景、目的与意义随着个人电脑的普及,多媒体信
2、息的传播和应用已经深入我们生活中的各个方面。其中数字音频凭借着其占用存储空间小,声音质量高的特点风靡全球,传统磁带和CD所统治的半壁江山已经成为了数字音频的天下。 当微软Windows的局限性和缺点开始暴露出来的同时,多样化的操作系统平台如Solaris,Linux以及MacOS等操作系统各自拥有不俗的表现以及庞大的用户群。面对繁多的操作系统平台,一款具有通用性的音频播放软件则是必不可少的。本音频播放软件采用Java语言编写,旨在利用Java的平台无关性特点,做出一款通用性强、占用空间少却五脏俱全的音频播放器。1.2 Java语音的特性首先,从面向对象的特性来看,Java是一种完全的面向对象设
3、计语言。Java的多态主要是建立在后期绑定(Late Bingding)或叫动态绑定(Dynamic Binding)基础之上的,这样Java先天就具备了对对象类型的自动判断能力。而C+是不支持动态绑定的,绑定动作发生在编译期而不是执行期,所以C+要实现多台的效果必须要使用虚函数。此外虽然C+语言支持封装和继承,但多态仍然是建立在编译时绑定的基础上,必须要通过虚函数实现。不仅如此,C+语言的指针操作允许使用goto语句,容易产生歧义的多重继承等特性也使C+不能严格符合面向对象的思想。其次,Java具有绝对的平台无关性,其使用一种虚拟机作为中间层来屏蔽平台差异。Java的源程序经过编译产生类文件
4、,类文件结构不同于传统的编译器生成的二进制文件,必须经过虚拟机的解释才能运行,因此Java被认为是一种解释性语言。虚拟机作为中间层负责把编译好的类文件转换为不同平台的指令。而对于不同的C,C+编译器,各种数据类型所占用空间有可能不一样,这种差异会影响程序的可移植性。此外,在内存管理方面,Java在其虚拟机内部实现了垃圾内存自动回收功能,能够自动判断那些内存不再被用户使用,这样就让用户在系统设计时从繁杂的内存管理工作中解脱出来。C和C+语言分配的内存空间必须由用户在不使用的时候进行回收,容易产生内存回收不充分的问题,形成内存漏洞。然而,Java也有瑕疵,由于是一种解释型语言,编译后的Java类文
5、件不能直接被操作系统执行,需要虚拟机的解释,因此其效率和C,C+相比有一定差距。在运行时,Java编写的软件需要操作系统中安装有虚拟机,所以程序的发布相对繁琐。总的说来,Java编程语言是简单与面向对象的分布式、安全与鲁棒的解释执行与高性能的多线程与动态执行的二、相关技术简介2.1 关于JMF技术JMF(Java Media Framework),Java媒体架构,是对应Java 2平台标准版(J2SE)的一种可选用的应用编程接口(API)软件包,它为音频和视频等媒体内容的捕获、回放、传输和编码转换等提供了一个统一的架构。JMF技术提供了先进的媒体处理能力,从而扩展了Java平台的功能。这些功
6、能包括:媒体捕获、压缩、流转、回放,以及对各种主要媒体形式和编码的支持,如M-JPEG、H.263、MP3、RTP/RTSP (实时传送协议和实时流转协议)、Macromedias Flash、IBM的HotMedia和Beatniks的Rich Media Format (RMF)等。JMF 2.1.1还支持广受欢迎的媒体类型,如Quicktime、Microsofts AVI和MPEG-1等。此外,JMF软件中包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。Java Media Framework(JMF)是构建在 Java Sound
7、之上的一层。JMF实际上将Java Sound用于其音频处理。JMF支持更多音频格式和更多回放功能,但缺少Java Sound的低层访问。另外,标准 JDK 发行版不包括JMF而包括 Java Sound。Java Sound: 添加音频和MIDI支持 与JDK 1.3及更高版本一起提供 是轻量级的 本身支持相对较少的音频格式(AIFF、WAV和AU) 通过Java Sound的服务供应商接口(SPI)可以进行扩展 JMF: 添加对音频、视频和其它基于时间的数据的支持 提供多种媒体格式的同步和控制功能 当前没有与任何JDK一起提供 本身支持许多音频格式(AIFF、WAV等)以及 MPEG和其它
8、格式 包含可扩展的编码器解码器媒体支持 2.2 JMF常用类JMF的常用类包括以下几个: 数据源(DataSource) 媒体定位器(MediaLocator) 播放器(Player) 处理器(Processor) 数据池(DataSink) 数据格式(Format) 管理器(Manager)2.2.1 数据源(DataSource) 在JMF中,DataSource对象就是数据源,它可以是从采集设备获得的数据,也可以是一个多媒体文件,也可以是从互联网上下载的数据流。对于DataSource对象,一旦你确定了它的位置和类型,对象中就包含了多媒体的位置信息和能够播放该多媒体的软件信息。当创建了
9、DataSource对象后,可以将它送入Player对象中,而Player对象不需要关心DataSource中的多媒体是如何获得的,以及格式是什么。2.2.2 媒体定位器(MediaLocator)DataSource通常用两种方式来定义,媒体定位器(MediaLocator)或URL(Universal Resource Locator)。MediaLocator类似于URL,并且可以由URL来构造,即使在没有安装相应的协议处理机制的情况下,也能构造MediaLocator(在Java,只有在系统上安装了URL协议的处理机制的情况下,才能构造一个URL)。MediaLocator用来定位采集
10、设备、本机的媒体文件、网络上的媒体文件以及网络RTP流。2.2.3 播放器(Player)如图2-1所示,播放器(Player)对象将音频、视频数据流作为输入,然后将数据流输出到音箱或屏幕上,就像播放器读取DV带中的数据,然后将音频信号送到音箱上,视频数据送到屏幕上一样。图2-1 处理器模型如图2-2所示,除了在播放器中提到了的6种状态以外,处理器对象还包括两种新的状态。这两种状态是在Unrealized状态之后,在Realizing 状态之前。 Configuring:当调用configure( )方法后,处理器对象进入该状态。在该状态下处理器对象连接到数据源并获取输入数据的格式信息。 Co
11、nfigured:当完成数据源连接,获得输入数据格式的信息后,处理器对象就处于Configured状态。图2-2 处理器的状态转换图2.2.4 数据池(DataSink)数据池(DataSink)用来读取数据源(DataSource)的媒体数据和输出到特定的目的地这里的目的地不同于以上所说的如音箱或屏幕。一个特定的DataSink或把数据输出到一个文件,或通过网络传输数据,或进行RTP广播。像Player一样,DataSink对象以DataSource作为参数,通过管理器(Manager)来构造。2.2.5 数据格式(Format)在JMF架构中,数据格式(Format)对象中保存了媒体的格式
12、(format)信息。它并不包括编码参数和全局时间信息。只是描述了该格式的编码名称和数据类别。Format的子类包括 AudioFormat和VideoFormat类,VideoFormat又有六个子类:H261Format、H263Format、IndexedColorFormat、JPEGFormat、RGBFormat和YUVFormat类4。在AudioFormat中,描述了音频格式的属性,如采样频率、每次采样的数据位数等等。在VideoFormat中则描述了视频数据的类型如H.263等。图2-3 表示JMF对音频格式和视频格式的定义:图2-3 JMF的媒体数据格式2.2.6管理器(M
13、anager)JMF提供了下面四种管理器(Manager): Manager:Manager相当于两个类之间的接口。例如当你需要播放一个DataSource对象,你可以通过使用Manager对象createPlayer( )方法创建一个 Player对象来播放它。使用Manager对象可以创建Player、Processor、DataSource和DataSink对象。 PackageManager:该管理器中保存了JMF类注册信息。 CaptureDeviceManager:该管理器中保存了截取设备的注册信息。 PlugInManager:该管理器中保存了JMF插件的注册信息。2.3 事件模
14、型JMF利用事件报告机制来使基于JMF的程序获知媒体系统当前的状态,从而使程序能够对相应状态的改变作出相应的操作。在任何时候,当一个JMF对象需要报告当前的状态,它将发出一个MediaEvent事件。MediaEvent的子类包括ControllerEvern,DataSinkEvent,GainChangeEvent,RTPEvent。对于任何一个能发送MediaEvent的JMF对象而言,JMF都定义了一个相应的侦听接口(listener interface)。为了能在某一MediaEvent事件发生时得到相应的通知,必须实现适当的侦听接口以及在对应的类体中重写该接口中处理MediaEve
15、nt事件的方法体,并通过调用addListener方法来接收此MediaEvent事件。JMF中的Controller对象,例如播放器(Player)和处理器(Processor),以及Control对象,例如GainControl都可以发出MediaEvent事件。(Player和Processor继承于Controller类 所有的Controller事件,ControllerEvent由Controller(如Player或Processor)产生,可分为三类:改变通知(change notification),关闭事件(closed event),状态转变事件(transition e
16、vent):1改变通知事件如RateChangeEvent,DurationUpdateEvent,FormatChangeEvent表明一些Controller的属性的改变。2状态转变事件可以使你的程序对Controller对象的状态转变作出反应。Player当从一个状态转为另一状态时都会产生transition events。3当Controller关闭时,它将产生关闭事件。三、系统架构和功能模块分析3.1.MVC模式概述 MVC架构是“Model-View-Controller”的缩写,即将“模型-视图-控制”作为应用程序构成的三要素。Event(事件)导致Controller改变Mod
17、el或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有以来的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。相应地,本软件也同样使用MVC思想指导设计,做到模块细化,分工明确,模块间逻辑顺序清晰的三大目标。流程如图3-1所示图3-1 框架流程图3.2系统目标对于音频播放器,必须给用户提供最简单的操作和最完善的功能。至少应该能够对音频文件进行播放、暂停、停止、音量和进度拖放操作等。除了最基本的操作以外,优秀的播放器还提供了许多附加的功能来突出显示该媒体播放器的特色,例如本播放器的歌词
18、实时显示。在这样的情况下,对播放器的设计目标要求有如下功能的实现: 用户界面窗口的控制功能:播放器主窗口控制、播放列表窗口的控制和歌词显示窗口的控制; 媒体文件的播放控制功能:开始播放、暂停播放、停止播放和拖动播放等; 媒体文件的管理功能:添加歌曲、添加目录,删除歌曲、清空列表、保存列表和装载列表; 音频文件信息显示功能:将音频文件的基本信息呈现给用户,同时用户自己可以设置一些信息。3.3系统功能模块概要设计本软件同样采用MVC的设计模式,做到控制,信息与视图的相互分离,同时相互间有联系紧密,互相调用,互为条件与依赖。故将系统分为五大模块进行构建,分别是 用户界面模块 播放控制模块 播放信息模
19、块 播放列表控制模块 歌词控制模块其相互关系如图3-2所示:播放信息模块用户界面模块播放控制模块播放列表控制模块歌词控制模块播放列表歌曲信息用户请求事件 用户请求事件 视图信息更新 视图信息更新 更新信息 信息 更新 读取 读取 更新图3-2 相互关系图3.3.1 用户界面模块为了实现软件产品界面的友好性和简洁性,同时又要保证功能的完整性,播放器的控制窗口的设计显得更是不同一般的重要。首先,给出该界面的组件组成。 于一个小小的窗口,要摆放这么多的控件,如果随便地放在窗口上的话,将会使窗口十分混乱,影响使用,所以要对其摆放位置进行合理的规划。这些控件被按照功能分成了3组,它们分别是控制面板、播放
20、列表面板和LRC面板。这样一来,就可以实现软件产品界面的友好性与简洁性,条理分明,在保证软件产品功能完整性的同时,方便了用户的使用。各面板关系如图3-3:主框架控制面板播放列表面板LRC面板系统菜单栏控制按钮控制条标签播放列表菜单栏LRC右键菜单播放列表LRC显示屏图3-3 面板关系图3.3.2 播放信息模块 放信息模块由播放信息,播放列表,歌曲信息节点三个层次嵌套而成,如3-4所示:播放信息播放列表1(默认)播放列表2播放状态。歌曲信息节点1歌曲信息节点2歌曲信息节点。歌曲信息节点1歌曲信息节点2歌曲信息节点。图3-4 信息模块关系图3.4音频文件播放逻辑3.4.1 对音频文件的传递 音频文
21、件的传送主要是用在播放列表处理的过程中,当播放器的用户想利用本播放器来播放一个音频文件时,首先要做的就是将该音频文件所在磁盘上的地址传到播放列表模块中,由播放列表将信息传递给播放信息模块进行数据更新。当要播放该文件时,就从播放信息模块中提取当前索引所指向该文件地址并将地址传送到播放控制模块,然后赋值给管理器Manager的新创建的媒体定位器对象(MediaLocator),Manager创建播放器(Player)后,剩下的工作都交给Player进行音频文件的播放。3.4.2 对歌词文件的传递 词的实时显示作为本播放器的重要功能,LRC歌词文件的处理流程也就显得至关重要,因为LRC歌词可能处于不
22、同位置,所以其地址和数据处理流程要比音频文件的处理流程要复杂得多。 先,也是将音频文件所在磁盘上的地址传到播放列表中,当要播放该文件时,就从播放列表中提取该文件地址并将地址传送到播放控制窗口,并将音频文件扩展名改为LRC,以获得一个与MP3文件相同路径的LRC歌词文件的地址,将音频文件名和LRC文件名传递到播放信息模块;在播放信息模块中先读取音频文件的TAG信息,然后将音频文件末尾的内容传递给歌词处理模块,检查该音频文件是否内嵌了歌词,如果内嵌歌词存在则分离出时间信息和歌词文本并返回;如果不存在内嵌歌词,则检查同路径下LRC歌词文件是否存在,如果存在则将其传递给歌词处理模块进行歌词处理,分离出
23、时间信息和歌词文本并返回;如果不存在则尝试自动关联歌词文件夹中是否存在该歌词。如果存在,则将其传递给歌词控制模块进行时间信息和歌词文本的分离,然后返回播放控制模块;如果此时返回的歌词存在,则将其传递给歌词显示窗口进行显示,并使用时间信息进行控制。如果上述3处都没有歌词,则可以使用歌词右键菜单中的关联歌词功能按钮手动关联LRC歌词文件。3.4.3 播放控制流程 器Player从建立之初到消亡,各有一系列已经在JMF中编写好的方法可以调用。 软件也自定义了一系列方法来实现播放,暂停,停止,时间拖拽,播放逻辑如图3-5所示:播放状态 Stop() Play() 暂停状态 停止状态 正在播放状态Pla
24、yer创建Player启动播放歌曲判断播放器状态恢复播放重新播放停止当前播放重置时间播放暂停停止时间条拖动事件分配资源图3-5 播放逻辑图四、系统详细设计与实现4.1开发平台及环境 系统采用的开发平台是IBM公司的Eclipse3.2平台。Eclipse是一个开放源代码的,基于Java的可扩展开发平台,也同时是目前非常流行的跨平台的自由集成开发环境(IDE)。Eclipse本身非常小,其设计思想是“一切皆为插件”,其他功能都是基于插件的形式与Eclipse无缝结合,协同工作,如Eclipse的图形开发环境(SWT/JFace),Java开发环境插件(JDT),多国语言包,等。在Eclipse启
25、动后,要真正用到某个插件是,该插件才会被动态载入内存,不再被使用的插件会在适当的时候被清出内存,本系统使用到的典型插件的例子就是用于开发图形界面的VisualEditor4.2用户界面模块详细设计与实现 户界面的主要有三大任务,即 受被改变的信息,显示/更新界面信息 听用户/播放器的事件 改变的信息传递给其他控制模块 重要的任务无意识监听用户/播放器的事件并作出相应的反应。4.3播放控制模块详细设计与实现 放功能是媒体播放器所有控制功能中最重要的一个功能,没有了它,播放器不能播放,也就不能称之为播放器了。在本播放器系统中,当点击播放会有两种状态转换:第一种是从停止状态转换到播放状态;第二种是从
26、暂停状态转换到播放状态。播放命令由播放按钮点击产生单机事件形成播放命令当播放器接收到播放命令后,会依次执行下面的过程: 1:查播放器的当前状态是否是暂停状态,即判断暂停状态布尔型变量isPaused的值。如果是暂停状态,那么让Player继续播放,计时器Timer开始计时,并置isPaused值为False后,退出播放控制过程;如果不是暂停状态,则执行第2步; 2:查播放列表中是否有媒体文件,如果没有则调用ListController添加歌曲过程进行添加,然后再次执行本过程进行播放;如果播放列表中有文件则执行第3步; 3:查播放列表索引,判断是否选中了播放列表的一首歌曲来进行播放,如果没有选择
27、,则选择播放列表中的第一首后执行第4步,如果已经选择了要播放的歌曲则直接执行第4步; 4:断要播放的歌曲在播放列表中的位置,如果是第一首则将上一首按钮置为无效,否则置为有效;如果是最后一首,则将下一首按钮置为无效,否则置为有效; 5:查播放模式中是否是单曲循环,如果是则将上一首和下一首都置为无效,否则置为有效, 6:取选择的歌曲的播放地址,使用Player控件进行播放,并调用歌词显示函数显示歌词; 建播放器核心代码如下:player = Manager.createRealizedPlayer(new MediaLocator(file:+mp3state.getCurrentlist().g
28、etCurrentsonginfo().getAbsolutepath(); 用播放状态的当前播放文件创建一个分配好资源处于就绪状态的播放器mp3state.getCurrentlist().getCurrentsonginfo().setTotalTime(player.getDuration().getSeconds() / 10E6) / 3.29); 用Player获取播放时间后赋值给播放状态中的当前列表的当前播放文件节点的总时间属性 player.start();/播放器开始播放4.4播放信息模块详细设计与实现(1)播放信息模块:播放信息模块主要负责记录播放器的各种状态,并提供get
29、/set函数进读取、设置,由于播放信息模块包含着播放列表模块,因此播放信息模块中包含着对播放列表的操作,当ListController播放列表控制模块要对播放列表进行操作时,需要间接调用播放信息模块的函数。主要变量如下:private JPanel contentPanel = null;private JSlider volumnSlider = null;private JCheckBox muteCheckBox = null;private JPanel headPanel = null;private JLabel nameLabel = null;private JLabel pl
30、ayLabel = null;private JLabel totalTimeLabel = null;private JPanel visualPanel = null;private JSlider processSlider = null;private JButton playlistButton = null;private JButton stopButton = null;private JButton playButton = null;private JButton previousButton = null;private JButton nextButton = null
31、;private JButton cutButton = null;private JButton mergeButton = null;private JButton aboutButton = null;private JFrame playListFrame = null; private JPanel jContentPane = null;private List playList = null;private JButton addButton = null;private JButton removeButton = null;private JButton exitButton
32、 = null;private JFrame cutFrame = null; private JPanel jContentPane1 = null;private JFrame mergeFrame = null; private JPanel jContentPane2 = null;private HashMap songMap = new HashMap();private Mp3TVShow mp3TVShow = new Mp3TVShow();private PlayerCTL playerCTL = new PlayerCTL(); private boolean progr
33、essSliderDrag = false;private int plstate = Mp3Enum.PLSTATE_HIDE;private int playBtnState = Mp3Enum.INIT;private int cutFrameState = Mp3Enum.CUTFRAME_HIDE;private int mergeFrameState = Mp3Enum.MERGEFRAME_HIDE;private JSlider startSlider = null;private JSlider endSlider = null;private JLabel jLabel =
34、 null;private JLabel jLabel1 = null;private JTextField cutFilePath = null;private JButton cutPathButton = null;private JButton cutExecButton = null;private JButton addMergeButton = null;private JButton removeMergeButton = null;private List mergeList = null;private JTextField mergedFilePath = null;pr
35、ivate JButton mergePathButton = null;private JButton mergeExecButton = null;private JDialog warningDialog = null; private JPanel jContentPane3 = null;private JLabel jLabel2 = null;private JButton sureButton = null;private ScrollThread scrollThread = null;private WindowDragControl windowDragControl =
36、 new WindowDragControl(this);private JCheckBox circleCheckBox = null;private JCheckBox shuffleCheckBox = null; 于播放信息中包含播放列表,播放列表中又包含歌曲节点,层层嵌套所以下面介绍播放列表和歌曲节点的内容及操作(2)播放列表模块: 列表可以看作是一个容器,每一个播放列表的对象都存放着许多歌曲节点,它主要负责对歌曲及诶单的操作,如添加文件,删除列表项,清空列表等 (3)歌曲信息节点模块: 构造中读取3字节的标签“TAG”,30字节的MP3标题信息,30字节的演唱者信息,30字节的专辑
37、信息,4字节的年代信息,30字节的备注信息和1个字节的音乐风格序列,共128字节的MP3歌曲信息 歌曲节点的核心代码主要是构造函数的代码,如下SongInfo(File f) /获取文件对象以构造歌曲节点/ TODO 自动生成构造函数存根filename=f.getName();/文件名absolutepath=f.getAbsolutePath();/文件路径Date d = new Date(f.lastModified();/日期lastmodifiedy=d.getYear()+1900;/年lastmodifiedm=d.getMonth()+1;/月lastmodifiedd=d.
38、getDate();/日try format=AudioSystem.getAudioFileFormat(f);/格式tempplayer=Manager.createPlayer(new MediaLocator(file:+f.getAbsolutePath();totaltime=tempplayer.getMediaTime().getSeconds();/创建一个未分配系统资源的播放器以便获取播放总时间tempplayer.close();formatinfo=format.toString(); catch.if(f.getName().endsWith(.mp3)|f.getN
39、ame().endsWith(.MP3) /若为mp3文件,则读取TAG获取信息try FileInputStream fin = new FileInputStream(f);byte data=new byte128;fin.read(data);getmp3info(data);/通过读取的128个字节信息获取歌曲信息 catch .4.5播放列表控制模块详细设计与实现播放列表主要负责对列表的操作,如新建列表,删除列表,载入列表,保存列表(1) 打开函数文件 打开文件时,要调用系统的文件选择器,新建一个JFileChooser的对象并进行一定的过滤,只能打开.wav和.mp3格式的文件,
40、若用户没有取消选择,则将文件或文件组添加到当前列表(2) 保存/装载列表函数 当一对象创建之后,只要需要,他会一直存在下去,担当应用程序结束,所有的对象都会走向消亡。有些应用场景下,如果能够将对象的状态保存下来,并在下一次应用程序启动是重新启动被保存的信息是非常有必要的,利用Java的I/O操作可以实现。 序列化(即将播放列表保存)1:要一个输出目的,因此需要创建一个OutputStream对象。2:OutputStream封装到一个ObjectOutputStream对象内。ObjectOutputStream是一个专门用于对象序列化的类3:用ObjectOutputStream提供的wri
41、teObject()方法即可将对象序列化,转换成字节序列,并将其发送到OutputStream所指代的媒介中。代码如下private static File file=new File(save”+filename);ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file);out.writeObject(this.getListofSonglist();out.close();同样,反序列化代码原理相同,在此不再一一赘述。4.6 歌词控制模块详细设计与实现 歌词控制模块主要负责歌词的加载,撤销,歌词的
42、识别,以及重新绘制歌词面板等读取LRC文件成功后翻译为两个链表,一个是时间链表,一个是歌词链表,二者一一对应,在后面的时间线程中每隔一秒检查一次歌词时间匹配 代码如下:double ct = player.getMediaTime().getSeconds();/当前时间double nt = 0;/读取LRC标示时间while (true) try s = in.nextLine();/读取下一行 catch (NoSuchElementException e) break;nt = 60 * Integer.parseInt(s.substring(1, 3)/分+ Integer.par
43、seInt(s.substring(4, 6)/秒+ Integer.parseInt(s.substring(7, 9) / 100.0; 大纲视图如图4-1:图4-1 大纲逻辑图五、系统运行环境及效果5.1 系统运行环境本软件运行需要Java Runtime Enrironment1.6.0的虚拟机运行环境以及JavaMediaFramework2_1_1的安装支持5.2 系统运行效果图5-1 程序主界面图六、总结面对软件市场上的各种各样的媒体播放器,要设计一个非常优秀的并非常有竞争力的音频播放器,并不是一件容易的事。但笔者还是设计实现了一个自制的带歌词实时显示的音频播放器,这不仅仅让我学
44、到了很多有关多媒体方面的知识,还让我了解到了如何去设计,以及如何实现播放器的各种功能。通过设计此系统,我学到了不少有用的知识,这些将对我今后的学习与工作有很大的帮助。首先,通过此播放器系统的设计,我对于设计开发一个软件系统的工作流程有了进一步的认识,明白了软件开发过程中各个阶段的基本任务,以及各个阶段之间的联系,明确了软件开发中形成的文档资料的重要性。第二,通过此播放器系统的设计,我基本上掌握了怎样使用Eclipse,JMF来编写多媒体应用程序。当然,由于这是我第一次进行多媒体系统的开发工作,所开发出来的系统不可避免地存在着一些不足,我会在今后的学习工作中逐步加以改进。在这个软件的编制过程中,
45、我参看了大量的书籍与资料,但由于能力水平有限,在程序中肯定有较多不完善的地方。总体来说,通过本学期的毕业设计,我在带歌词实时显示的音频播放器系统的开发、Eclipse,Java及JMF编程等方面有了一定的进步,为以后从事更大型的软件设计奠定了坚实的基础。参考文献1 青岛东合信息技术有限公司.JavaSE程序设计高级教程.北京:电子工业出版社,2010,2372922(美)埃克尔.Java编程思想.北京:机械工业出版社,2007,501003赵真.Eclipse开发技术详解.北京:化学工业出版社,2010,10404CSDN.JMF指南.20085CSDN. 利用JMF进行多媒体编程, 20086陈刚. Eclipse从入门到精通(第二版).清华大学出版社,2007