《基于java的mp3播放器的设计与实现》由会员分享,可在线阅读,更多相关《基于java的mp3播放器的设计与实现(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 event):1改变通知事件如RateChangeEvent,DurationUpdateEvent,FormatChangeEvent表明一些Controller的属性的改变。2状态转变事件可以使你的程序对Controller对象的状态转变作出反应。Player当从一个状态转为另一状态时都会产生transition events。3当Controller关闭时,它将产生关闭事件。三、系统架构和功能模块分析3.1.MVC模式概述 MVC架构是“Model-View-Con