基于java语言mp3播放器的设计与实现_第1页
基于java语言mp3播放器的设计与实现_第2页
基于java语言mp3播放器的设计与实现_第3页
基于java语言mp3播放器的设计与实现_第4页
基于java语言mp3播放器的设计与实现_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MP3播放器的设计与实现摘要声音是信息交流的源头,而有规律的声音可以创造意境,给人以美的享受,当其与图形界面相互交融的时候,整个世界就被丰富了起来。多媒体技术是以声音为基础,再加上日益进步的科技还有超前的思维,使得电脑的性能日益提高,与之相关的JAVA技术也不断被改进,虽然在有的方便还有些欠缺,但是音频技术的出现,为JAVA语言的发展指出了一条更加光明的方向。JAVA语言有着占用空间小、可嵌入、跨平台性的优良特点为JAVA语言的应用提供了很好的平台。本播放器基于JMF设计,运用JAVA语言实现列表的新建与清空。歌曲的添加、删除、重命名。简单的播放、暂停、歌曲的上一首、下一首切换、并选择播放模式。音量的调节,歌曲属性的查看等简单功能。能够满足一般需求的简易播放器。关键词声音;播放器;JMF;JAVA;ECLIPSEDESIGNANDIMPLEMENTATIONOFMUSICPLAYERABSTRACTTHESOUNDISTHESOURCEOFINFORMATIONINTERACTIONANDTHESOUNDOFTHERHYTHMCANCREATETHEARTISTICCONCEPTION,GIVEPEOPLETHEENJOYMENTOFBEAUTY,WHENTHESOUNDANDGRAPHICALINTERFACEBLENDWITHEACHOTHER,THEWORLDWILLBEWIDELYRICHEDMULTIMEDIATECHNOLOGYISBASEDONSOUND,COUPLEDWITHTHEINCREASINGPROGRESSOFSCIENCEANDTECHNOLOGYANDADVANCEDTHINKING,MAKINGCOMPUTERPERFORMANCEHASIMPROVED,JAVAANDRELATEDTECHNOLOGIESHAVEBEENIMPROVED,ALTHOUGHINSOMECONVENIENTALSOSOMELACK,BUTAUDIOTECHNOLOGY,THEDEVELOPMENTOFJAVALANGUAGEPOINTSABRIGHTERTHEDIRECTIONOFTHEJAVALANGUAGEHASPROVIDEDAGOODPLATFORMFORAPPLICATIONOFSMALLSPACEOCCUPATION,GOODCHARACTERISTICSOFEMBEDDEDCROSSPLATFORMFORJAVALANGUAGETHEPLAYERISDESIGNEDBYJMF,USINGJAVALANGUAGETOCREATEANEWLISTANDCLEARTHELISTADDSONGS,DELETESONGS,RENAMESONGSSIMPLETOPLAY,PAUSE,PREVIOUSTRACK,NEXTTRACKSWITCHSONGS,ANDSELECTTHEPLAYMODEADJUSTTHEVOLUME,SONGATTRIBUTESVIEWOTHERSIMPLEFUNCTIONSEASYTOMEETTHEGENERALNEEDSOFTHEPLAYERKEYWORDSSOUNDMUSICPLAYERJMFJAVAECLIPSE目录摘要ABSTRACT1引言111项目背景112技术现状与发展趋势213ECLIPSE中使用JMF22技术背景421JMF结构4211定义JMF4212JMF高层结构7213时间模型5214管理器8215事件模型8216数据模型6217控制922重要实例PLAYER对象103系统分析与概要设计1631系统分析16311可行性分析16312需求分析1632什么是音频17321音频17322常见音频格式1733常见播放器19331千千静听19332酷狗19333QQ音乐1934功能模块设计194系统设计实现及关键代码2141基本结构2142界面设计2243播放2244菜单设计2445列表设计275系统测试2951总体功能测试描述2952功能测试的目的与内容29521界面测试29522播放测试33523菜单测试3453功能测试总结37参考文献36结论37致谢38外文文献39中文翻译591引言11项目背景在信息不断变更和交互的时代,听歌已经变得非常流行不光是个人的行为也不再是局限于本地资源。网络音乐不断流行,随之而来的是网络音乐播放器的火热,很多的网页或者网站上都提供了很好的比较规范的音乐搜索项目,还有许多知名的音乐网站提供免费的音乐下载,形成了资源共享的局面,听歌已经不是许多年前只能依靠录音机或者随身听来实现了。不光如此,国内的国外的歌手的作品也都进入到了网络上来,所以越来越多的不同风格的音乐在网络上都能够呈现出来。但是,在网络收费还是较高的情况下,大多数人们还是倾向把音乐文件下载到本地来听,这样方便在无网络的时候也可以欣赏音乐,故而下载好的音乐文件就必须有个软件能够使它播放出来,因此,MP3播放软件的制作就有了比较重要的意义了。现在存在的多媒体播放器种类繁多,样式也比较新颖,还有就是用各种不同语言和平台事项的。MICROSOFT公司1998年推出了VISUALC60,它是支持WIN32平台应用程序APPLICATION、服务SERVICE和控件CONTROL开发的可视化编程的集成环境。与VC50的最大不同之处是它的帮助功能更强大,MSDNMICROSOFTDEVELOPERNETWORKING为包括VC60在内的所有微软的程序产品提供在线帮助;另外,类的对象的可用成员函数、成员变量及函数的参数类型与个数都能动态显示在屏幕上,用户无须记住那些复杂而又枯燥乏味的函数名及复杂的参数,这无疑使得用VC编程更加容易。所以VC60可谓是MICROSOFT公司的王牌产品,编程功能强大而赢得广大程序的偏爱。MP3是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(MOVINGPICTUREEXPERTSGROUPAUDIOLAYERIII),简称为MP3。它被设计用来大幅度地降低音频数据量。利用MPEGAUDIOLAYER3的技术,将音乐以110甚至112的压缩率,压缩成容量较小的文件,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。它是在1991年由位于德国埃尔朗根的研究组织FRAUNHOFERGESELLSCHAFT的一组工程师发明和标准化的。用MP3形式存储的音乐就叫作MP3音乐。它能够将CD品质的数字录音压缩成极小的文件,并将其存储在电脑之中。实际上,可以将MP3文件压缩成比光盘文件小12倍的文件。因此大大节省了我们的硬盘空间。在各类语言中JAVA因为具有如下特性而被人广泛使用成了常用编写程序的语言。JAVA语言是一种纯的面向对象的语言,这使得它与其他语言,如C语言的面向过程不同,大大的提高了代码的封装性和代码的阅读性,是一种思想观念的转变。而且在平台方面,JAVA语言具有相当好的平台无关性,即一次开发,到处运行。它使用的一种叫做虚拟机的机制作为中间层来屏蔽平台的差异化。JAVA的源程序经过编译产生相应的类文件,类文件必须通过虚拟机的解释才能够运行。每一种操作系统都有属于自己的虚拟机机制。故而有很好的可移植性。除此之外,在内存管理方面,JAVA在虚拟机内部实现了垃圾自动回收的功能,能够自动判断内存的使用情况。从而进行合理的释放。JMF为多媒体的获取、播放、处理和传输定义了统一的体系结构、消息处理机制和程序设计接口,提供给开发者一个可以扩展的并且跨平台的强大的媒体工具。因而使用JAVA语言开发MP3播放器是比较有前瞻性的。12技术现状与发展趋势JAVA是由SUNMICROSYSTEMS公司(已被甲骨文收购)于1995年5月推出的JAVA程序设计语言和JAVA平台的总称。JAVA平台由JAVA虚拟机(JAVAVIRTUALMACHINE)和JAVA应用编程接口(APPLICATIONPROGRAMMINGINTERFACE、简称API)构成。JAVA应用编程接口为JAVA应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个JAVA平台之后,JAVA应用程序就可运行。现在JAVA平台已经嵌入了几乎所有的操作系统。这样JAVA程序可以只编译一次,就可以在各种系统中运行。JAVA语言吸收了SMALLTALK语言和C语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。JAVA媒体架构JMF是一个通用的API,它允许JAVA开发者用许多不同的方法处理媒体。该核心框架支持不同媒体(如音频输出和视频输出)间的时钟同步。它是一个标准的扩展框架,允许用户制作纯音频流和视频流。SUN以四种不同的专用版本提供JMF211技术,满足专业开发人员的各类需求,第一个是一个轻便型版本,它完全采用JAVA语言编写,适用于任何JAVA兼容系统。此外,开发人员还可选择分别适用于SOLARIS、WINDOWS或LINUX等操作系统的性能最优化软件包,以提高性能和能力。几乎所有的媒体类型的操作和处理都可以通过JMF来实现。全面的讨论JMF所提供的所有特征已经超过了本指南的范围,使用几个简单的媒体应用程序来实现此框架的构建模块。JMF软件也是JAVAMEDIA系列软件的一部分。JAVAMEDIA系列软件包括JAVA3D、JAVA2D、JAVASOUND和JAVAADVANCEDIMAGING等API。采用各种JAVAMEDIAAPI,软件开发商人员就能容易、快速地为他们已有的各种应用程序和客户端JAVA小程序增添丰富的媒体功能,如流式视频、3D图像和影像处理等。就是说,各种JAVAMEDIAAPI发挥了JAVA平台的固有优势,将“编写一次,到处运行“的能力扩展到了图像、影像和数字媒体等各种应用领域,从而大大缩减了开发时间和降低了开发成本。13ECLIPSE中使用JMF项目属性JAVA构建路径库添加外部JAR选择JMF安装目录下的JAR文件确定。这样就完成了JMF包的导入安装需求要运行此指南中的例程序,你需要如下的工具和组件JAVA2平台,标准版,编译和运行演示程序JAVA媒体框架,版本211A或者更高一块已经安装并且配置号的适当的声卡一台或者多台测试机器演示的源代码文件在MEDIAPLAYERJAR中最后的一个演示应用显示了JMF在网络中的应用。如果需要,此演示能运行在一个独立的机器上,使用此机器即是传输方也是接收方。可是要观察到在网络中使用JMF的所有功能,你仍然需要至少两台联网的机器。下载安装文件将JMF安装到你的计算机中的第一步是在JMF的主页中下载安装文件,它同样包括了JMF源代码和API文档的链接。23页的RESOURCES中有下载JMF的链接。目前,JMF有WINDOWS,SOLARIS,LINUX等版本,以及可运行在任何装有虚拟机的计算机上一个纯JAVA版本。为了增加性能,你需要下载一个与你操作系统所适应的版本。任何在一个操作系统JMF版本下书写和编译的代码都可以方便的移植到另外的操作系统上。例如,如果你下载了一个SOLARIS版本的JMF并且编译了一个类,这些类就可以在LINUX上使用,不会有任何问题。作为选择,你可以选择下载纯JAVA版本,或者跨平台版本的JMF。这些版本没有使用操作系统特有的库文件。如果没有合适的JMF版本适合的操作系统,那么跨平台版本就是一个不错的选择。安装JMF下载完JMF安装程序后,双击安装程序的图标。大部分安装程序都会有个选项,安装本地库到系统目录中;例如,WINDOWS版本安装程序会有一个选项“MOVEDLLSTOWINDOWS/SYSTEMDIRECTORY”。最好将此选项选中,因为它能确保这些操作系统的库文件能正确的安装在安装的过程中,你还需要选择项目来更新系统的CLASSPATH和PATH变量。如果这些选项被关闭,那么在你编译和运行本指南的例程序的时候就需要在CLASSPATH中引入JMF的JAR文件。图11JMF引用的库2技术背景21JMF结构211定义JMFJMF实际上是JAVA的一个类包。JMF技术提供了先进的媒体处理能力,从而扩展了JAVA平台的功能。这些功能包括媒体捕获、压缩、流转、回放,以及对各种主要媒体形式的转换和编码的支持,如MJPEG、H263、MP3、RTP/RTSP实时传送协议和实时流转协议、MACROMEDIASFLASH、IBM的HOTMEDIA和BEATNIKS的RICHMEDIAFORMATRMF等。JMF211还支持广受欢迎的媒体类型,如QUICKTIME、MICROSOFTAVI和MPEG1等。此外,JMF211软件中包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。使用JMF工作的基础。为完成这些,我们会创建三个的独立工作的例程序。每个例子都会建立前一个例子的基础上,显示JMF功能性的不同方面。假定你曾经使用过并且已经熟悉了JAVA程序语言。除了JAVA核心和JMF的类之外,我们会使用一些JAVAAWT和SWING类用于创建GUI,也会有一些JAVA网络类用于在网络中传输媒体。对GUI和网络类一些熟悉有助于你更快的明白观点和这里的例子,但并非是阅读本指南必须的。JMF体系结构你曾见过了使用JMF播放本地媒体文件是多么的容易,现在我们将后退一步,来看看一幅是如何通过JMF创建了如此成熟的基于媒体的应用程序的大的画面,是如何通过JMF创建了如此成熟的基于媒体的应用程序。全面的了解JMF体系结构是没有意义的,本节将给你一个大体的概念,关于高级的JMF组件是如何组合起来创建想得到的东西。JMF的组件结构非常的灵活,它的组件一般可以分成三个部分INPUT描述某种被用于在进程休息的时候作为一个输入的媒体。PROCESS执行某些输入上的活动。一个过程有一个明确的输入和输出。大量的过程可用,能被用于一个输入或者一批输入。这些过程能被联系起来,一个过程的输出被用于另外一个过程的输入。在这种风格中,大量的过程可能被应用于一个输入。(这段期间是可选择的我们开始的两个例子没有包含真正的数据过程,只有一个来自文件的输入和一个通过PLAYER的输出。)OUTPUT描述了媒体的某些目的地。从这些描述中,你可以想象到JMF组件体系结构听起来就好像在一个典型的立体声系统或者VCR之后。很容易设想到,使用JMF就如同打开电视或者在立体声音箱系统下调节声音的风格。例如,录制喜爱的电视节目的简单的动作能在这些组件的基础中INPUT是电视广播流,在同一个频道运输音频和视频。PROCESS是一个记录设备(就是,一个VCR或者许多的数字设备)转换模拟或者数字音频视频广播流成适合复制到磁带或其他媒体上的格式。OUTPUT是记录已格式化轨迹(音频和视频)到某些类型的媒体上。JMF资料处理模式以下图片说明了JMF数据处理模块并对每个类型给出了例子使用此模式,很容易明白我们前面的两个例子,从文件中输入音频和视频并输出到本地计算机上。在后面的章节中,我们也会谈论一些通过传播和接收音频媒体的JMF网络功能。使用可视化组件上面的界面方法都返回一个JAVAAWTCOMPONENT类的实例。没个实例都视可加载到我们窗体上的可视组件。这些组件都与PLAYER有直接的联系,所以在这些组件上的所有可视元素的处理都会产生PLAYER播放媒体后相应的变化。在我们将这些组件加入到我们的窗体的之前,必须要保证它们不为空。因为并不是所有的媒体播放器包括每一种可视组件,我们只需添加相关播放器类型的组件。比如,一般来说一个音频播放器没有可视组件,所以GETVISUALCOMPONENT就要返回空。你不会想在音频播放器窗体上添加可视组件的。212JMF高层结构图21传统的多媒体数据处理设备与JMF的比较JMF高层结构正如图2所示,数据源(DATASOURCE)就像一盒磁带一样封装了媒体数据流,而播放器(PLAYER)提供了像VCR一样的机制处理和控制数据。213时间模型图22JMF时间模型JMF的时间精准到纳秒级,虽然在JAVA中其他的类也支持纳秒级的时间,但是在JMF中,一个时间点一般用TIME对象来表示。支持JMF时间模型的类必须实现CLOCK才能追踪媒体数据流。CLOCK接口定义了基本的时间定位盒同步操作,而这些操作在表现媒体数据时是必须的。CLOCK中的数据MEDIATIME表示在媒体流中的当前的位置。流的开头是媒体时间0,流的最后是媒体时间的最大时间。媒体流的持续时间(DURATION)是媒体数据流的从开始到结束的经历的时间。214管理器通过使用管理器(MANAGER)这个对象,JMF使得用户实现的新的关键接口与已存在的类无缝对接。管理器模型使用了工厂模式10。使用JMF来完成程序时,我们需要使用MANAGER的CREATE方法来构造PLAYER,PROCESSORS,DATASINK,DATASOURCE来为你的应用程序服务。例如如果你式通过一个输入设备捕获媒体数据,你将会使用CAPTURTDEVICEMANAGER来找出哪些设备是可用的,并且通过这些对象来获取相关信息。215事件模型图23JMF事件模型JMF使用一个结构化的事件报告机制来使得应用程序来与当前的媒体的状态来保持通信。同时它还使得基于JMF的程序能够响应媒体驱动的错误状况,比如说资源部可获得这种情况。当JMF对象需要报告当前的情况时,它会抛出MEDIAEVENT。MEDIAEVENT由许多特定类型的事件。对于每一个可以抛出MEDIAEVENT的对象,JMF定义了相应的监听者对象。216数据模型图24JMF数据模型JMF媒体播放器经常使用DATASOURCE来管理媒体内容的转移。DATASOURCE封装了媒体位置,使用的协议等信息,这些信息式用来传输媒体的。DATASOURCE是通过JMF中的MEDIALOCATOR或者URL来指明的。MEDIALOCATOR与URL相似并且能通过一个URL构造,但是它与URL的区别是即使在相应的协议处理没被安装的情况下它也能被构造,而URL不行。217控制图25JMF控制JMF控制提供了一种机制来设置和查询对象的属性。控制器一般提供相应的用户接口的访问,通过访问来改变对象的属性。许多JMF对象都可获得控制器接口,包括DATASOURCE对象,DATASINK对象和JMFPLUGINS。22重要实例PLAYER对象1创建一个PLAYER对象通过使用媒体MANAGER来直接创建一个PLAYER对象,要显示这个PLAYER对象,你获取这个对象的组件并且将这些组件加到你的APPLET的外观或者应用程序的窗口中。当你想创建一个新的PLAYER对象时,你通过MANAGER的CREATEPLAYER或者CREATEPROCESSOR的方法创建它。MANAGER通过使用你指定的媒体的URL对象或者MEDIALOCATOR对象来创建一个合适的对象。URL对象只有在相关的URLSTEEAMHANDLER被安装的情况下才能被正确的构造,而MEDIALOCATOR则没有这个限制。2在PLAYER对象未识别(REALIZED)前阻塞许多可以被PLAYER对象调用的方法要求PLAYER对象在已被识别(REALIZED)的状态。保证当你调用这些方法之前PLAYER对象已经被识别的方法是使用MANAGER提供的CREATEREALIZEDPLAYER方法来创建PLAYER对象。这个方法提供了一个便捷的方式在一步就创建并且识别(REALIZE)一个PLAYER对象。当这个方法被调用时,它会阻塞直到这个PLAYER对象被识别。MANAGER也提供了一个相同的CREATEREALIZEDPROCESSOR方法来创建一个已识别的PROCESSOR对象。注意阻塞PLAYER对象或者PROCESSOR对象直到被识别可能引起不好的结果。比如,如果CREATEREALIZEDPLAYER在一个APPLET中被调用,APPLETSTART和APPLETSTOP将不能打断PLAYER对象的构造过程。3显示媒体接口组件PLAYER对象一般有两种类型的用户接口组件,一个可视化组件和一个控制板组件。有些PLAYER实现可以显示额外的组件,比如说音量控制和下载进度条。4显示一个可视化组件如果有,一个可视化组件就是PLAYER对象表现媒体的可视化表示。即使一个音频播放器也有可能有一个可视化组件,比如说波形显示或者其它生动的特性。要显示PLAYER对象的可视化组件,你1通过调用GETVISUALCOMPONENT得到组件。2将它加到APPLET的外观表示或者应用程序的窗口中。你可以通过它的可视化组件访问PLAYER对象的的显示属性,如它的X,Y坐标。PLAYER组件的布局受到AWT布局管理器的控制。5显示控制面板组件PLAYER对象通常有一个控制板允许用户控制媒体的表示。比如说,一个PLAYER对象可能一个有开始按钮,结束按钮,暂停按钮和一个用来调控音量的滑动条与其关联。每一个PLAYER对象提供一个默认的控制板。要显示这个默认的控制板1调用GETCONTROLPANELCOMPONENT得到组件。2将返回的组件加到APPLET的外观表示和应用程序的窗口。如果你选择定义一个定制的用户接口,你可以实现GUI组件并且调用正确的PLAYER方法来响应用户的动作。如果你将这个定制组件注册成CONTROLLERLISTENER,当PLAYER对象的状态改变时,你也可以更新这个组件。6显示一个增益控制组件PLAYER对象的实现支持音频增益调节的GAINCONTROL接口。GAINCONTROL提供方法调节有音频的音量,如SETLEVEL和SETMUTE。如果PLAYER对象提供了GAINCONTROL组件要显示它,你1调用GETGAINCONTROL从PLAYER对象获得GAINCONTROL,如果返回为空,则PLAYER不支持GAINCONTROL接口。2在返回的GAINCONTROL上调用GETCONTROLCOMPONENT。3将返回的组件加到APPLET的外观表示或者应用程序的窗口上。注意GETCONTROLS方法不返回PLAYER对象的GAINCONTROL。你只能通过调用GETGAINCONTROL来访问GAINCONTROL。7显示一般的控制组件许多PLAYER对象有可以被用户控制的其他的属性。比如说,一个视频PLAYER对象可能允许用户调整亮度和对比度,但是他们不是通过PLAYER接口来管理。你可以通过调用GETCONTROLS来得知一个PLAYER对象支持哪些一般的控制。比如说,你可以调用GETCONTROLS来得知一个PLAYER对象是否支持CACHINGCONTROL接口。8显示一个下载进度组件CACHINGCONTROL接口是控制的特殊类型,它被PLAYER对象实现,能够报告它的下载进度。CACHINGCONTROL提供了一个默认的进度条组件。这个组件会自动的随着下载进度而更新。要在APPLET中使用默认的进度条实现CONTROLLERLISTENER接口,并且在CONTROLLERUPDATE方法中监听CACHINGCONTROLEVENT。当你第一次收到一个CACHINGCONTROLEVENT1当事件到达时调用GETCACHINGCONTROL方法得到缓冲控制。2在CACHINGCONTROL上调用GETPROGRESSBAR以得到默认的进度条组件。3将进度条组件加入到你的APPLET外观组件上。每次你收到一个CACHINGCONTROLEVERT,检查下载是否已经完成。当GETCONTENTPROGRESS返回的值与GETCONTENTLENGTH一样,移除进度条。当进度条需要更新时,PLAYER对象抛出一个CACHINGCONTROLEVENT。如果你实现你自己的进度条组件,当CACHINGCONTROLEVENT被抛出时,你应该能监听这个事件并且更新进度条。9设置播放速率PLAYER对象的速率决定媒体时间相对时间基线怎样变化,它定义了当时间基线的一个单位前进的时候,媒体时间迁移几个单位。PLAYER对象的速率可以被认为是一个暂时的刻度因素。比如说,当PLAYER开始后,速率为20代表媒体时间的前进速度是时间基线时间前进的两倍。理论上,一个PLAYER对象的速率可以被设置为任何值,负值代表反向的播放媒体。然而,有些媒体的格式依赖于帧,所以反向的播放或者在非标准的速率上播放它是不可能的,也是不实际的。要设置速率,你调用SETRATE并且传入一个浮点类型的值作为这个暂时的刻度因素。当SETRATE被调用时,这个方法返回当前的设置,即使它没被改变。PLAYER对象仅保证支持10的速率。10设置开始位置设置PLAYER对象的媒体时间相当于在一个媒体流中设置读取的位置。对于象文件这样的媒体数据源,媒体时间是有界限的,最大的媒体时间定义为媒体流结束的时间。要设置媒体时间,你调用SETMEDIATIME并且传入一个TIME对象,这个对象代表你想设置的时间。11帧定位有些PLAYER对象允许你定位到一个视频的特殊帧。这使得你可以简单的找到开始位置的特殊帧而不必指明这个位置的精确的时间。支持帧定位的PLAYER对象实现了FRAMEPOSITIONINGCONTROL。要设置帧的位置,你调用FRANEPOSITIONINGCONTROL的SEEK方法。当你查找一帧时,PLAYER对象的媒体时间的值将会设置成那一帧的开始时间,同时一个MEDIATIMEEVENT将会被抛出。有些PLAYER对象可以将媒体时间和帧的位置进行转换。如果支持转换,你可以使用FRAMEPOSITIONINGCONTROL的MAPFRAMETOTIME和MAPTIMETOFRAME方法来获得这些信息。(支持FRAMEPOSITIONINGCONTROL的PLAYER对象不需要导出这个信息。)注意在媒体时间和帧之间不存在一一对应的关系帧是一段持续的时间,所以一些不同的媒体时间可能会对应同一帧。12准备开始大多数PLAYER对象不能立即开始。在播放开始前,某些硬件和软件的状况需要被满足。比如说,如果一PLAYER对象之前从未开始过,则它需要分配缓存来存储媒体数据。或者如果媒体数据在网络设备上,PLAYER对象可能需要在下载数据之前建立一个网络连接。即使PLAYER对象以前曾经播放过,缓存区在当前的媒体位置也可能包含无效的数据。13识别(REALIZING)和预取(PREFETCHING)PLAYER对象JMF将一个PLAYER对象的准备过程分成两个阶段,识别(REALIZING)和预取(PREFETCHING)。在开始一个PLAYER对象之前进行识别和预取使得当你调用START方法时能最小化开始播放媒体的时间,并且为用户帮助创建一个响应迅速,具有交互性的PLAYER对象。实现CONTROLLERLISTENER接口使得当这些操作发生时你能够控制它。注意PROCESSOR在准备过程中引入了第三个阶段,称为配置CONFIGURING。在这个阶段中,PROCESSOR的选项能够被选择以指定PROCESSOR怎样来操纵媒体数据。要得到更多的信息,请查阅选择跟踪处理选项。你调用REALIZE方法将PLAYER对象进入识别REALIZING状态并且开始识别过程。你调用PREFETCH方法将PLAYER对象进入预取中(PREFETCHING)状态并初始化预取过程。REALIZE和PREFETCH方法都是异步的并且会立即返回。当PLAYER对象完成了要求的动作时,它会抛出REALIZECOMPLETEEVENT或者PREFETCHCOMPLETEEVENT。PLAYER对象的状态描述了PLAYER对象在这些状态下的动作。PLAYER对象在预取状态下准备开始播放,而且它启动反应时间不能再被减少。然而通过SETMEDIATIME设定媒体时间可能使PLAYER对象返回到被识别(REALIZED)状态并且同时使得启动时延增加。记住一个在预取完毕的PLAYER对象与系统资源相关。因为有些资源,比如说声卡,可能一次仅仅能被一个程序使用,有一个在预取完毕的PLAYER对象生存时可能会阻止其它PLAYER对象开始。14获取开始时延要得到需要多少时间启动PLAYER对象,你可以调用GETSTARTLATENCY。对于有可变开始时延的PLAYER对象,GETSTARTLATENCY的返回时间将会是最大的可能开始时延。对于某些媒体类型,GETSTARTLATENCY可能会返回LATENCY_UNKNOWN。GETSTARTLATENCY返回的开始时延可能会因为PLAYER对象当前的状态不同而不同。比如说,在完成了一个预取的动作后,由GETSTARTLATENCY返回的值通常会更小。一个可以被加入到PLAYER对象的CONTROLLER对象将会返回一个有用的值一旦它被预取后。(要得到更多信息,请查阅使用PLAYER对象同步控制器(CONTROLLERS)。)15开始表现一般你会通过调用START方法来开始表现一个媒体流。START方法通知PLAYER对象尽可能快的开始表现媒体数据。如果必须,START方法通过完成识别和预取的操作使得PLAYER对象开始播放。如果START方法是被一个已被开始(STARTED)的PLAYER对象调用,唯一的效果是一个STARTEVENT将被抛出。时钟定义了SYNCSTART方法以用来同步化。请查阅同步多个媒体流获取更多的信息。要使得PLAYER对象在指明点开始媒体流1通过调用SETMEIDATIME指明你想开始的媒体流的点。2在PLAYER对象上调用START方法。16停止表现有四种情况媒体的表现将会停止1当STOP方法被调用时。2当指定的停止的时间到达时。3当没有更多的媒体数据时。4当被接收的媒体数据相对于可接受的播放速率说太慢时。当PLAYER对象停止时,如果媒体源能被控制,它的媒体时间将被冻结。如果PLAYER对象在表现流式媒体,则可能不能冻结媒体时间。在这种情况下,仅仅是媒体数据的接收被停止数据继续被流式化,媒体时间继续前进。要立即停止一个PLAYER对象,你调用STOP方法。如果你在一个处于停止(STOPEED)状态的PLAYER对象调用STOP方法,唯一的效果是STOPBYREQUESTEVENT被抛出。17在一个指定的时间停止表现你可以调用SETSTOPTIME方法来指明什么时候该停止PLAYER对象。PLAYER对象在到达指定的停止时间将停止。如果PLAYER对象的速率是正值,PLAYER对象将在媒体时间大于或者等于停止时间时停止。如果PLAYER对象的速率是负值,PLAYER对象将在媒体时间小于或者等于停止时间时停止。如果当前的媒体时间已经大于指定的停止时间,PLAYER对象将立即停止。比如说,假定一个PLAYER对象的媒体时间是50并且SETSTOPTIME设定停止时间是60、如果PLAYER对象的速率是正值,媒体时间正在增加,PLAYER对象在媒体时间大于或者等于60的时候将停止。然而如果PLAYER对象的速率是负值,它将反向播放,这时PLAYER对象将会立即停止,因为媒体时间已经超过了停止时间。(要获取更多关于PLAYER的状态的信息,请查阅设置播放速率。)你也可以在一个停止(STOPPED)状态的PLAYER对象上调用SETSTOPTIME方法。然而你只能设置停止时间在处于已开始(STARTED)的PLAYER对象上,如果停止时间当前还没有设定。如果已开始(STARTED)的PLAYER对象已经有一个停止时间,SETSTOPTIME抛出一个错误。你可以调用GETSTOPTIME来得到当前已安排的停止时间。如果时钟没有安排的停止时间,GETSTOPTIME方法将返回CLOCKRESET。要移除停止时间以让PLAYER对象持续的播放直到它到达媒体结束,调用SETSTOPTIMECLOCKRESET。18释放PLAYER对象的资源DEALLOCATE方法使得PLAYER对象释放所有的独占资源并且最小化非独占资源。虽然对于PLAYER对象的缓存和存储管理未被指明,大多数PLAYER按照JAVA对象的标准分配那么大的缓存。当DEALLOCATE方法调用时一个较好实现的PLAYER对象尽量释放多的内部存储。DEALLOCATE方法只能被处于已停止(STOPPED)状态的PLAYER对象调用。为了避免CLOCKSTARTEDERRORS,你应该在调用DEALLOCATE方法前调用STOP方法。在正在预取(PREFETCHING)和预取完毕(PREFETCHED)状态下的PLAYER对象上调用DEALLOCATE方法使得这个PLAYER会返回到被识别(REALIZED)状态。如果在PLAYER对象在正在识别(REALIZING)状态下调用DEALLOCATE方法,PLAYER对象将会抛出DEALLOCATEEVENT并且返回到未被识别UNREALIZED状态下。(一旦一个PLAYER对象被识别,它将不能返回到未被识别(UNREALIZED)状态。)一般情况下你在PLAYER对象现在未被使用的时候调用DEALLOCATE方法。比如说,一个APPLET应该调用DEALLOCATE方法作为它的STOP方法的一部分。通过调用DEALLOCATE方法,当释放其它资源为系统整体来使用时,程序将维护一个指向PLAYER对象的引用。(JMF不会限制一个以前被预取完毕(PREFETCHED)或者开始(STARTED)的现处于已识别(REALIZED)状态的PLAYER对象维护信息,而这些信息将使得PLAYER对象在未来某个时刻会更快的开始。)当你使用完一个PLAYER对象(或者其他的控制器)并不打算在以后用到,你应该调用CLOSE方法。CLOSE方法暗示控制器(CONTROLLER)将不会再被用到并能被自己关闭。调用COLSE方法会使得控制器(CONTROLLER)释放所有占用的资源,导致它停止所有的活动。当一个控制器(CONTROLLER)被关闭后,它会抛出CONTROLLRCLOSEDEVENT。一个已经关闭的控制器(CONTROLLER)不能被重新打开,在一个已经关闭的控制器(CONTROLLER)调用方法将会产生错误。19查询PLAYER对象PLAYER对象可以提供关于它当前的参数的信息,这些参数包括速率,媒体时间,持续时间。20获得播放速率要获得PLAYER对象当前的速率,你调用GETRATE方法。调用这个方法将会返回一个浮点型数据作为速率的值。21获得媒体时间要获得PLAYER对象当前的媒体时间,你调用GETMEDIATIME。调用GETMEIDATIME返回一个TIME类型的对象作为当前的媒体时间。如果PLAYER对象没有在表现媒体数据,返回媒体表现开始的时间点。注意媒体时间和帧之间不存在一对一的关系。每个帧表现的是一段时间,而媒体时间在这个期间仍然会继续前进。22获取时间基线的时间通过得到TIMEBASE对象再调用GETTIME方法,你可以得到一个PLAYER对象的当前时间基线时间MYCURRENTTBTIMEPLAYER1GETTIMEBASEGETTIME当一个PLAYER正在运行时,通过调用MAPTOTIMEBASE方法,你可以得到相对于一个特殊的媒体时间的时间基线的时间。23取媒体流的持续时间因为程序经常需要得知一个特定的媒体流要运行多久时间,所有的控制器(CONTROLLER)都实现了DURATION接口。这个接口定义了一个单一的方法,GETDURATION。如果速率是10,持续时间代表了一个媒体对象将会运行的时间长度。一个媒体流的持续时间仅能通过PLAYER对象得到。如果持续时间不能通过GETDURATION调用返回,将会返回DURATION_UNKNOWN。如果PLAYER对象还没有达到一个可以得到媒体源的持续时间的状态时,就会出现这种情况。在稍后的时间,持续时间可能会能得到,此时调用GETDURATION将会返回持续时间。如果媒体源没有一个已定义的持续时间,比如说一个直播的广播,GETDURATION返回DURATION_UNBOUNDED。3系统分析与概要设计31系统分析311可行性分析对于MP3播放器,应该给用户提供最简单的操作和最完善的功能。起码应该能够对MP3及其他常见的媒体类型进行播放、暂停、停止、拖放操作等。除了最基本的操作以外,优秀的MP3播放器还提供了许多附加的功能来突出显示该媒体播放器的特色。为了实现一个播放器所应该具有的功能,并给播放器的使用者提供最简单的操作,本系统设计的目标就是要让设计的播放器能够对MP3和常见的多媒体文件进行播放、暂停播放、停止播放、拖动播放等;在提供操作的简易性的同时还要保证操作界面的友好性。系统分析得有详细的设计,包括可行性分析和需求分析。经济可行性本程序是属于个人电脑上的开发,故而没有什么巨大的成本技术可行性JAVASOUND是一个小巧的低层API,支持数字音频和MIDI数据的记录/回放。在JDK130之前,JAVASOUND是一个标准的JAVA扩展API,但从JAVA2的130版开始,JAVASOUND就被包含到JDK之中。由于JAVA有着跨平台(操作系统、硬件平台)的特点,基于JAVASOUND的音频处理程序(包括本文的程序)能够在任何实现了JAVA13的系统上运行,无需加装任何支持软件。使用JAVASOUNDAPI,可以实现各种基于声音的应用,例如声音录制、音乐播放、网络电话、音乐编辑等。JAVASOUNDAPI又以各种解码和合成器SPI(服务提供者接口,SERVICEPROVIDERINTERFACE)为基础,实现各种音乐格式的解码与转码。在处理输入音频时,对于来自各种音频输入端口的信号,例如麦克风、CD播放器、磁带播放器等,可以在它们到达TARGETDATALINE之前,利用混频器控制输入混频,最后在程序中通过TARGETDATALINE获得数字化的音频输入流。类似地,在处理输出音频时,混频器用来对一系列来自SOURCEDATALINE的数据进行混频处理,经处理后的信号可输出到各种输出端口,例如扬声器、耳机等。人员可行性本程序可以在本人以及老师和同学指导下完成,并且本人的理论基础还是不错的,所以应该可以完成312需求分析整体分析通过此播放器实现简单的MP3和WAV格式歌曲的播放。在播放过程中可以实现对歌曲某个时间点的播放、上一首的播放、下一首的播放、暂停。了解该歌曲的详细信息、对音量的控制、还有就是对播放顺序的选择等功能具体分析1MP3的播放此部分为系统的核心部分,主要使用了JAVASOUND控制操作系统中的音频系统,以音频系统的音频输入输出形式进行MP3的播放,此部分是播放控制模块,播放信息控制模块的基础。2播放控制针对MP3音乐文件的播放进行控制,包括常用的播放器的基本播放控制功能和停止功能、下一首功能、上一首功能,包括播放器播放模式的控制,主要是实现了五种常见的播放模式单曲循环、顺序播放、循环播放。播放模式的控制主要是用在MP3处于播放模式控制下的音乐文件播放完成时使用。主要对当前播放状态的控制,例如歌曲播放现在是处于播放状态还是停止状态的情况。还有就是对当前播放歌曲的信息可以进行描述。3列表、文件管理在歌曲的添加中,必须先进行歌曲列表的添加,这样才能先创建一个列表,然后才能对列表进行添加MP3或者WAV形式的歌曲进行添加。而且默认的列表不能够删除。对列表可以进行新建、删除、重命名、清空。对文件可以进行添加和删除,对文件夹可以进行文件的添加。4音量的控制音量的控制主要完成的是音量的大小调节还有静音功能的操作。设置一个滚动条,通过对滚动条的拖拉实现音量的大小变化。点击静音按钮即可实现静音,再点击一下即可恢复有声状态。32什么是音频321音频音频是个专业术语,人类能够听到的所有声音都称之为音频,它可能包括噪音等。音频定义为以下三种AUDIO,指人说话的声音,常指300HZ3400HZ的频带。指存储声音内容的文件。在某些方面能指作为波滤的振动。322常见音频格式首先,我们来明确一下数字音频的概念,它是指一个用来表示声音强弱的数据序列,由模拟声音经抽样、量化和编码后得到的。简单地说,数字音频的编码方式就是数字音频格式,我们所使用的不同的数字音频设备一般都对应着不同的音频文件格式。常见的数字音频格式有1WAV格式WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音、视频格式,被WINDOWS平台及其应用程序广泛支持。WAV格式支持许多压缩算法,支持多种音频位数、采样频率和声道,采用441KHZ的采样频率,16位量化位数,因此WAV的音质与CD相差无几,但WAV格式对存储空间需求太大不便于交流和传播。2MIDI格式MIDI是MUSICALINSTRUMENTDIGITALINTERFACE的缩写,又称作乐器数字接口,是数字音乐/电子合成乐器的统一国际标准。它定义了计算机音乐程序、数字合成器及其它电子设备交换音乐信号的方式,规定了不同厂家的电子乐器与计算机连接的电缆和硬件及设备间数据传输的协议,可以模拟多种乐器的声音。MIDI文件就是MIDI格式的文件,在MIDI文件中存储的是一些指令。把这些指令发送给声卡,由声卡按照指令将声音合成出来。3CD格式大家都很熟悉CD这种音乐格式了,扩展名CDA,其取样频率为441KHZ,16位量化位数。CD存储采用了音轨的形式,又叫“红皮书”格式,记录的是波形流,是一种近似无损的格式。4REALAUDIO格式REALAUDIO是由REALNETWORKS公司推出的一种文件格式,最大的特点就是可以实时传输音频信息,尤其是在网速较慢的情况下,仍然可以较为流畅地传送数据,因此REALAUDIO主要适用于网络上的在线播放。现在的REALAUDIO文件格式主要有RAREALAUDIO、RM(REALMEDIA,REALAUDIOG2)、RMXREALAUDIOSECURED等三种,这些文件的共同性在于随着网络带宽的不同而改变声音的质量,在保证大多数人听到流畅声音的前提下,令带宽较宽敞的听众获得较好的音质。33常见播放器331千千静听千千静听是一款完全免费的音乐播放软件,拥有自主研发的全新音频引擎,集播放、音效、转换、歌词等众多功能于一身。其小巧精致、操作简捷、功能强大的特点,深得用户喜爱,被网友评为中国十大优秀软件之一,并且成为目前国内最受欢迎的音乐播放软件。千千静听支持几乎所有常见的音频格式,包括MP3/MP3PRO、AAC/AAC、M4A/MP4、WMA、APE、MPC、OGG、WAVE、CD、FLAC、RM、TTA、AIFF、AU等音频格式以及多种MOD和MIDI音乐,以及AVI、VCD、DVD等多种视频文件中的音频流,还支持CUE音轨索引文件。侧屏幕提供有关影碟或歌曲的信息或广告,可以将丰富多彩的WEB页面、生动传神的画面及声音、相关背景的文字整合在同一个画面上,使用户得到一个完整的声、视、讯信息。332酷狗酷狗KUGOU是国内最大也是最专业的P2P音乐共享软件。酷狗主要提供在线文件交互传输服务和互联网通讯,采用了P2P的先进构架设计研发,为用户设计了高传输效果的文件下载功能,通过它能实现P2P数据分享传输,还有支持用户聊天、播放器等完备的网

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论