




已阅读5页,还剩68页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MP3播放器的设计与实现摘要声音是信息交流的源头,而有规律的声音可以创造意境,给人以美的享受,当其与图形界面相互交融的时候,整个世界就被丰富了起来。多媒体技术是以声音为基础,再加上日益进步的科技还有超前的思维,使得电脑的性能日益提高,与之相关的Java技术也不断被改进,虽然在有的方便还有些欠缺,但是音频技术的出现,为Java语言的发展指出了一条更加光明的方向。Java语言有着占用空间小、可嵌入、跨平台性的优良特点为Java语言的应用提供了很好的平台。本播放器基于JMF设计,运用Java语言实现列表的新建与清空。歌曲的添加、删除、重命名。简单的播放、暂停、歌曲的上一首、下一首切换、并选择播放模式。音量的调节,歌曲属性的查看等简单功能。能够满足一般需求的简易播放器。关键词:声音;播放器;JMF;Java;EclipseDesignandimplementationofmusicplayerAbstractThesoundisthesourceofinformationinteractionandthesoundoftherhythmcancreatetheartisticconception,givepeopletheenjoymentofbeauty,whenthesoundandgraphicalinterfaceblendwitheachother,theworldwillbewidelyriched.Multimediatechnologyisbasedonsound,coupledwiththeincreasingprogressofscienceandtechnologyandadvancedthinking,makingcomputerperformancehasimproved,Javaandrelatedtechnologieshavebeenimproved,althoughinsomeconvenientalsosomelack,butaudiotechnology,thedevelopmentofJavalanguagepointsabrighterthedirectionof.TheJavalanguagehasprovidedagoodplatformforapplicationofsmallspaceoccupation,goodcharacteristicsofembeddedcrossplatformforJavalanguage.TheplayerisdesignedbyJMF,usingJavalanguagetocreateanewlistandclearthelist.Addsongs,Deletesongs,renamesongs.Simpletoplay,pause,previoustrack,nexttrackswitchsongs,andselecttheplaymode.Adjustthevolume,songattributesViewothersimplefunctions.Easytomeetthegeneralneedsoftheplayer.Keywords:sound;musicplayer;JMF;Java;Eclipse0目录摘要.ABSTRACT.1引言.11.1项目背景.11.2技术现状与发展趋势.21.3ECLIPSE中使用JMF.22技术背景.42.1JMF结构.42.1.1定义JMF.42.1.2JMF高层结构.72.1.3时间模型.52.1.4管理器.82.1.5事件模型.82.1.6数据模型.62.1.7控制.92.2重要实例:PLAYER对象.103系统分析与概要设计.163.1系统分析.163.1.1可行性分析.163.1.2需求分析.163.2什么是音频.173.2.1音频.173.2.2常见音频格式.173.3常见播放器.193.3.1千千静听.193.3.2酷狗.193.3.3QQ音乐.193.4功能模块设计.194系统设计实现及关键代码.214.1基本结构.214.2界面设计.224.3播放.224.4菜单设计.244.5列表设计.275系统测试.295.1总体功能测试描述.295.2功能测试的目的与内容.295.2.1界面测试.295.2.2播放测试.3315.2.3菜单测试.345.3功能测试总结.37参考文献.36结论.37致谢.38外文文献.39中文翻译.5921引言1.1项目背景在信息不断变更和交互的时代,听歌已经变得非常流行不光是个人的行为也不再是局限于本地资源。网络音乐不断流行,随之而来的是网络音乐播放器的火热,很多的网页或者网站上都提供了很好的比较规范的音乐搜索项目,还有许多知名的音乐网站提供免费的音乐下载,形成了资源共享的局面,听歌已经不是许多年前只能依靠录音机或者随身听来实现了。不光如此,国内的国外的歌手的作品也都进入到了网络上来,所以越来越多的不同风格的音乐在网络上都能够呈现出来。但是,在网络收费还是较高的情况下,大多数人们还是倾向把音乐文件下载到本地来听,这样方便在无网络的时候也可以欣赏音乐,故而下载好的音乐文件就必须有个软件能够使它播放出来,因此,MP3播放软件的制作就有了比较重要的意义了。现在存在的多媒体播放器种类繁多,样式也比较新颖,还有就是用各种不同语言和平台事项的。Microsoft公司1998年推出了VisualC+60,它是支持Win32平台应用程序(application)、服务(service)和控件(control)开发的可视化编程的集成环境。与VC+50的最大不同之处是它的帮助功能更强大,MSDN(MicrosoftDeveloperNetworking)为包括VC+60在内的所有微软的程序产品提供在线帮助;另外,类的对象的可用成员函数、成员变量及函数的参数类型与个数都能动态显示在屏幕上,用户无须记住那些复杂而又枯燥乏味的函数名及复杂的参数,这无疑使得用VC+编程更加容易。所以VC60可谓是Microsoft公司的王牌产品,编程功能强大而赢得广大程序的偏爱。MP3是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(MovingPictureExpertsGroupAudioLayerIII),简称为MP3。它被设计用来大幅度地降低音频数据量。利用MPEGAudioLayer3的技术,将音乐以1:10甚至1:12的压缩率,压缩成容量较小的文件,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。它是在1991年由位于德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。用MP3形式存储的音乐就叫作MP3音乐。它能够将CD品质的数字录音压缩成极小的文件,并将其存储在电脑之中。实际上,可以将MP3文件压缩成比光盘文件小12倍的文件。因此大大节省了我们的硬盘空间。在各类语言中Java因为具有如下特性而被人广泛使用成了常用编写程序的语言。Java语言是一种纯的面向对象的语言,这使得它与其他语言,如C语言的面向过程不同,大大的提高了代码的封装性和代码的阅读性,是一种思想观念的转变。而且在平台方面,Java语言具有相当好的平台无关性,即:一次开发,到处运行。它使用的一种叫做虚拟机的机制作为中间层来屏蔽平台的差异化。Java的源程序经过编译产生相应的类文件,类文件必须通过虚拟机的解释才能够运行。每一种操作系统都有属于自己的虚拟机机制。故而有很好的可移植性。除此之外,在内存管理方面,Java在虚拟机内部实现了垃圾自动回收的功能,能够自动判断内存的使用情况。从而进行合理的释放。JMF为多媒体的获取、播放、处理和传输定义了统一的体系结构、消息处理机制和程序设计接口,提供给开发者一个可以扩展的并且跨平台的强大的媒体工具。因而使用Java语言开发MP3播放器是比较有前瞻性的。31.2技术现状与发展趋势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以四种不同的专用版本提供JMF2.1.1技术,满足专业开发人员的各类需求,第一个是一个轻便型版本,它完全采用Java语言编写,适用于任何Java兼容系统。此外,开发人员还可选择分别适用于Solaris、Windows或Linux等操作系统的性能最优化软件包,以提高性能和能力。几乎所有的媒体类型的操作和处理都可以通过JMF来实现。全面的讨论JMF所提供的所有特征已经超过了本指南的范围,使用几个简单的媒体应用程序来实现此框架的构建模块。JMF软件也是JavaMedia系列软件的一部分。JavaMedia系列软件包括Java3D、Java2D、JavaSound和JavaAdvancedImaging等API。采用各种JavaMediaAPI,软件开发商人员就能容易、快速地为他们已有的各种应用程序和客户端Java小程序增添丰富的媒体功能,如流式视频、3D图像和影像处理等。就是说,各种JavaMediaAPI发挥了Java平台的固有优势,将编写一次,到处运行的能力扩展到了图像、影像和数字媒体等各种应用领域,从而大大缩减了开发时间和降低了开发成本。1.3Eclipse中使用JMF项目属性Java构建路径库添加外部jar选择JMF安装目录下的JAR文件确定。这样就完成了JMF包的导入安装需求要运行此指南中的例程序,你需要如下的工具和组件:Java2平台,标准版,编译和运行演示程序Java媒体框架,版本2.1.1a或者更高一块已经安装并且配置号的适当的声卡一台或者多台测试机器演示的源代码文件在mediaplayer.jar中最后的一个演示应用显示了JMF在网络中的应用。如果需要,此演示能运行在一个独立的机器上,使用此机器即是传输方也是接收方。可是要观察到在网络中使用JMF的所有功能,你仍然需要至少两台联网的机器。下载安装文件将JMF安装到你的计算机中的第一步是在JMF的主页中下载安装文件,它同样包括了4JMF源代码和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文件。图1.1JMF引用的库52技术背景2.1JMF结构2.1.1定义JMFJMF实际上是Java的一个类包。JMF技术提供了先进的媒体处理能力,从而扩展了Java平台的功能。这些功能包括:媒体捕获、压缩、流转、回放,以及对各种主要媒体形式的转换和编码的支持,如M-JPEG、H.263、MP3、RTP/RTSP(实时传送协议和实时流转协议)、MacromediasFlash、IBM的HotMedia和Beatniks的RichMediaFormat(RMF)等。JMF2.1.1还支持广受欢迎的媒体类型,如Quicktime、MicrosoftAVI和MPEG-1等。此外,JMF2.1.1软件中包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。使用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数据处理模块并对每个类型给出了例子:6使用此模式,很容易明白我们前面的两个例子,从文件中输入音频和视频并输出到本地计算机上。在后面的章节中,我们也会谈论一些通过传播和接收音频媒体的JMF网络功能。使用可视化组件上面的界面方法都返回一个java.awt.Component类的实例。没个实例都视可加载到我们窗体上的可视组件。这些组件都与Player有直接的联系,所以在这些组件上的所有可视元素的处理都会产生Player播放媒体后相应的变化。在我们将这些组件加入到我们的窗体的之前,必须要保证它们不为空。因为并不是所有的媒体播放器包括每一种可视组件,我们只需添加相关播放器类型的组件。比如,一般来说一个音频播放器没有可视组件,所以getVisualComponent()就要返回空。你不会想在音频播放器窗体上添加可视组件的。2.1.2JMF高层结构图2.1传统的多媒体数据处理设备与JMF的比较JMF高层结构正如图2所示,数据源(DataSource)就像一盒磁带一样封装了媒体数据流,而播放器(Player)提供了像VCR一样的机制处理和控制数据。2.1.3时间模型图2.2JMF时间模型JMF的时间精准到纳秒级,虽然在Java中其他的类也支持纳秒级的时间,但是在JMF中,一个时间点一般用Time对象来表示。支持JMF时间模型的类必须实现Clock才能追踪媒体数据流。Clock接口定义了7基本的时间定位盒同步操作,而这些操作在表现媒体数据时是必须的。Clock中的数据mediatime表示在媒体流中的当前的位置。流的开头是媒体时间0,流的最后是媒体时间的最大时间。媒体流的持续时间(Duration)是媒体数据流的从开始到结束的经历的时间。2.1.4管理器通过使用管理器(Manager)这个对象,JMF使得用户实现的新的关键接口与已存在的类无缝对接。管理器模型使用了工厂模式10。使用JMF来完成程序时,我们需要使用Manager的create方法来构造Player,Processors,DataSink,DataSource来为你的应用程序服务。例如如果你式通过一个输入设备捕获媒体数据,你将会使用CapturtDeviceManager来找出哪些设备是可用的,并且通过这些对象来获取相关信息。2.1.5事件模型图2.3JMF事件模型JMF使用一个结构化的事件报告机制来使得应用程序来与当前的媒体的状态来保持通信。同时它还使得基于JMF的程序能够响应媒体驱动的错误状况,比如说资源部可获得这种情况。当JMF对象需要报告当前的情况时,它会抛出MediaEvent。MediaEvent由许多特定类型的事件。对于每一个可以抛出MediaEvent的对象,JMF定义了相应的监听者对象。2.1.6数据模型图2.4JMF数据模型JMF媒体播放器经常使用DataSource来管理媒体内容的转移。DataSource封装了8媒体位置,使用的协议等信息,这些信息式用来传输媒体的。DataSource是通过JMF中的MediaLocator或者URL来指明的。MediaLocator与URL相似并且能通过一个URL构造,但是它与URL的区别是即使在相应的协议处理没被安装的情况下它也能被构造,而URL不行。2.1.7控制图2.5JMF控制JMF控制提供了一种机制来设置和查询对象的属性。控制器一般提供相应的用户接口的访问,通过访问来改变对象的属性。许多JMF对象都可获得控制器接口,包括DataSource对象,DataSink对象和JMFplug-ins。92.2重要实例: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中被调用,Applet.start和Applet.stop将不能打断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提供方10法调节有音频的音量,如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。当你第一次收到一个CachingControlEvent:(1)当事件到达时调用getCachingControl方法得到缓冲控制。(2)在CachingControl上调用getProgressBar以得到默认的进度条组件。(3)将进度条组件加入到你的applet外观组件上。每次你收到一个CachingControlEvert,检查下载是否已经完成。当getContentProgress返回的值与getContentLength一样,移除进度条。当进度条需要更新时,Player对象抛出一个CachingControlEvent。如果你实现你自己的进度条组件,当CachingControlEvent被抛出时,你应该能监听这个事件并且更新进度条。9.设置播放速率Player对象的速率决定媒体时间相对时间基线怎样变化,它定义了当时间基线的一个单位前进的时候,媒体时间迁移几个单位。Player对象的速率可以被认为是一个暂时的刻度因素。比如说,当Player开始后,速率为2.0代表媒体时间的前进速度是时间基线时间前进的两倍。理论上,一个Player对象的速率可以被设置为任何值,负值代表反向的播放媒体。然而,有些媒体的格式依赖于帧,所以反向的播放或者在非标准的速率上播放它是不可能的,也是不实际的。要设置速率,你调用setRate并且传入一个浮点类型的值作为这个暂时的刻度因素。当setRate被调用时,这个方法返回当前的设置,即使它没被改变。Player对象仅保证支持1.0的速率。10.设置开始位置设置Player对象的媒体时间相当于在一个媒体流中设置读取的位置。对于象文件这样的媒体数据源,媒体时间是有界限的,最大的媒体时间定义为媒体流结束的时间。11要设置媒体时间,你调用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。对于有可12变开始时延的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对象的媒体时间是5.0并且setStopTime设定停止时间是6.0、如果Player对象的速率是正值,媒体时间正在增加,Player对象在媒体时间大于或者等于6.0的时候将停止。然而如果Player对象的速率是负值,它将反向播放,这时Player对象将会立即停止,因为媒体时间已经超过了停止时间。(要获取更多关于Player的状态的信息,请查阅设置播放速率。)你也可以在一个停止(Stopped)状态的Player对象上调用setStopTime方法。然而你只能设置停止时间在处于已开始(Started)的Player对象上,如果停止时间当前还没有设定。如果已开始(Started)的Player对象已经有一个停止时间,setStopTime抛出一个错误。13你可以调用getStopTime来得到当前已安排的停止时间。如果时钟没有安排的停止时间,getStopTime方法将返回Clock.RESET。要移除停止时间以让Player对象持续的播放直到它到达媒体结束,调用setStopTime(Clock.RESET)。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对象的当前时间基线时间:myCurrentTBTime=player1.getTimeBase().getTime();14当一个Player正在运行时,通过调用mapToTimeBase方法,你可以得到相对于一个特殊的媒体时间的时间基线的时间。23.取媒体流的持续时间因为程序经常需要得知一个特定的媒体流要运行多久时间,所有的控制器(Controller)都实现了Duration接口。这个接口定义了一个单一的方法,getDuration。如果速率是1.0,持续时间代表了一个媒体对象将会运行的时间长度。一个媒体流的持续时间仅能通过Player对象得到。如果持续时间不能通过getDuration调用返回,将会返回DURATION_UNKNOWN。如果Player对象还没有达到一个可以得到媒体源的持续时间的状态时,就会出现这种情况。在稍后的时间,持续时间可能会能得到,此时调用getDuration将会返回持续时间。如果媒体源没有一个已定义的持续时间,比如说一个直播的广播,getDuration返回DURATION_UNBOUNDED。153系统分析与概要设计3.1系统分析3.1.1可行性分析对于MP3播放器,应该给用户提供最简单的操作和最完善的功能。起码应该能够对MP3及其他常见的媒体类型进行播放、暂停、停止、拖放操作等。除了最基本的操作以外,优秀的MP3播放器还提供了许多附加的功能来突出显示该媒体播放器的特色。为了实现一个播放器所应该具有的功能,并给播放器的使用者提供最简单的操作,本系统设计的目标就是要让设计的播放器能够对MP3和常见的多媒体文件进行播放、暂停播放、停止播放、拖动播放等;在提供操作的简易性的同时还要保证操作界面的友好性。系统分析得有详细的设计,包括可行性分析和需求分析。经济可行性本程序是属于个人电脑上的开发,故而没有什么巨大的成本技术可行性Javasound是一个小巧的低层API,支持数字音频和MIDI数据的记录/回放。在JDK1.3.0之前,JavaSound是一个标准的Java扩展API,但从Java2的1.3.0版开始,JavaSound就被包含到JDK之中。由于Java有着跨平台(操作系统、硬件平台)的特点,基于JavaSound的音
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋个人佣金合同范本
- 审计政府采购合同范本
- 包车合同范本简单版
- 台安辅警考试题库2025(有答案)
- 家具仓库购物合同范本
- 奖励孩子的合同范本
- 简单购置物品合同范本
- 济南网上购物合同范本
- 购买按揭房屋合同范本
- 购买营运电车合同范本
- 小学实验室化学危险物品安全管理制度
- 数字化转型背景下的计算机类工程技术人才培养模式研究
- 医务人员职业道德规范学习体会
- 欧莱雅物流管理模式
- 2024沪教版初中英语新教材六年级上册单词表(默写表)
- 教学课件-饭店管理概论第二版
- 开学第一课开学立规矩课件21
- 《冲击波疗法》课件
- 基于模型的系统工程(MBSE)及MWORKS实践 课件 4 MBSE教材讲义 第四章 设计仿真一体化的MBSE方法
- 《中国世界遗产》课件
- 糖尿病眼底病变
评论
0/150
提交评论