摘要:
本文先简述了JMF发展的历史,后对JMF的基本构架做了综述。对重要的类和接口都有详细的介绍。
关键字:JMF(java media framework)、具有时域约束关系的媒体数据
正文:
JMF是SUN公司开发的应用编程接口(API),它为java的应用处理具有时域约束关系的数据提供了一种简单而统一的结构。
一、历史
JMF由最早的1.0版本发展到现在的2.1.1版本,对多媒体数据的处理和控制能力逐渐增强。JMF1.0是由Sun Microsystems, Inc.Silicon Graphics Inc.和Intel Corporation共同开发的,主要功能局限于多媒体数据的回放。JMF2.0是由Sun Microsystems, Inc.和IBM共同开发,并增加了多媒体数据的捕获、传输及代码转换功能。在最新的JMF2.1.1中包含了很多新特色和优化,如改进的RTP API,对H.263/1998 (RFC 2429)的支持, Direct Audio渲染器和捕获器,对Java编译器的性能提升等。
二、JMF的特色
Java Media Framework (JMF)为具有时域约束关系的数据的各种处理,如获取、处理、传送提供了整一的体系和消息协议。JMF可以支持绝大多数的标准多媒体数据类型,如 AIFF, AU, AVI, GSM, MIDI, MPEG, QuickTime, RMF 和 WAV.为了发挥JAVA平台的优势,JMF坚持传递给开发者“Write Once, Run Anywhere”的理念。JMF提供了通用的跨平台的JAVA API以访问底层的媒体框架。JMF应用能衡量底层的处理系统的计算能力,从而使开发者轻易编写出可移动的针对具有时域约束关系数据的应用。
JMF的高层体系(如下图)中,高层的API用于数据的处理;而低层的API提供了对自定义的处理部件和扩展的无缝整合。这样的设计使得开发者既能快速的开发出面向时域约束关系数据的应用,同时对未来的应用和新的媒体应技术具有极大的灵活性和扩展性。
在JMF中特定时刻的获取是通过时间对象获得的。支持JMF的类通过使用CLOCK跟踪媒体数据对象中的特定时刻。CLOCK接口定义了基本的计时和同步操作。CLOCK使用TimeBase记录时间,TimeBase提供的数据仅是当前时刻且基于系统时钟。时钟对象通过TimeBase的起始时间、媒体的起始时间即回放比率计算当前的时间。公式为:MediaTime = MediaStartTime + Rate(TimeBaseTime - TimeBaseStartTime)。
管理器(manager)使得接口的新的实现与原有的类无缝的整合。JMF使用四种管理器:Manager用于创造播放器、处理器、数据源和数据池,PackageManager,用于记录包含JMF类的包,CaptureDeviceManager,用于记录可用的采集设备和PlugInManager,用于记录实用的PlugIn。
JMF使用事件(event)汇报机制使得基于JMF的程序获得当前多媒体处理系统的状态并对由媒体数据引起的错误做出调整。JMF对象可在需要的时候触发MediaEvent事件。对应于不同对象的MediaEvent事件,JMF定义了对应的Listener接口。要想获得某事件的提示,需要在触发此事件的对象中调用addlistener函数。
DataSource封装了媒体数据的地点和发布媒体数据的协议及软件。一旦获取,特定的DataSource不能被重用封装其他媒体对象。JMF的数据资源可以按照传输初始化方式(how data transfer is initiated)分为两类,一是Pull Data-Source是由客户发起数据传输,典型的协议比如HTTP和FILE;另一类是Push Data-Source相对应的是由服务器发起的数据传输。Push Data-sources包括广播媒体,多播媒体及VOD。
Control类提供了设置和查询对象属性的机制。Controller objects, DataSource,objects, DataSink objects, and JMF plug-ins都拥有相对应的控制接口。下图是GainControl接口的示意图:
GainControl可以调整媒体回放的音量,当然,音量改变是一种媒体事件,因而GainControl可以触发GainChangeEvent事件。Control接口可以将控制功能提供给最终用户,比如播放器既提供视频部件也提供控制板部件。当然开发者也可以自定义GUI部件,通过注册自定义的GUI部件为播放器实体的ControllerListener,便可实现对播放器实体状态的监听与响应。
高级的开发者和技术提商可通过主要两种方法对JMF功能进行扩展,一是用自定义的处理单元(plug-ins)替换标准的处理单元;二是直接实现Controller, Player, Processor, DataSource或DataSink接口。
在JMF中,表现(presentation)过程是由Controller接口控制的。Controller定义基本的状态并为对象定义控制、实现、捕获媒体对象的功能。一个控制器含有多种的控制器特有的媒体事件(MeidaEvent)用于标识本身状态的改变。通过控制器监听接口接收控制器传来的事件。JMF API具有两类的控制器:播放器(player)和处理器(processor)。控制器一般也不用于重用。
处理器对媒体数据的处理分为几个阶段:(如下图所示)
首先要对数据进行去多路化(demultiplexing),媒体数据内的多种轨迹(track)会被抽取分离。前处理是应用特效算法处理抽取出的轨迹。转换代码可以转换媒体对象的格式。后处理是指对编码后的数据应用特效算法。最后为多路化使得不同的轨迹融合为单一的媒体文件。这些不同的处理过程在JMF中是由不同的plug-in实现的。
处理器的具体创建过程如下。在处理器进入realizing状态之前,具有两个附加的准备状态:configuring和configured。当配置被调用时,处理器进入configuring状态,进行与DataSource联络、去多路化和识别输入数据格式的操作。当与DataSource的相连并识别出数据格式后,处理器进入configured状态。当Realize被调用后,处理器进入realized状态。此时处理器被完全创建了。
媒体采集器件在JMF中抽象为DataSource。比如一个具有采集实时媒体数据能力的仪器可以被抽象为PushDataSource。对于具有多路媒体的数据流,DataSource可以获得与之相对应的SourceStream。
DataSink用于从数据源读取数据并将其呈递到某目的地,一般来说不是表现(presentation)设备。DataSink对象是由管理器(manager)使用数据源创造的,它通过DataSinkEvent通告其状态。
Java媒体架构(JMF)是一个令人激动的通用的API,它允许Java开发者用许多不同的方法处理媒体。本指南主要通过使用工作的例子提供一个JMF的一些主要的特征的概述。阅读完本指南后,你将会明白JMF体系结构中的主要播放功能。你同样能正确的使用JMF,使用现存的例子和可为更多特殊功能扩展的源代码。
本指南包含着以下主题:
· 下载和安装JMF
· 主要的JMF类以及它们在JMF体系结构中的应用
· 播放本地的媒体文件
· 为媒体的存取和操作制作以和图形用户界面(GUI)
· 通过网络传播媒体
· 通过网络接收媒体
几乎所有的媒体类型的操作和处理都可以通过JMF来实现。全面的讨论JMF所提供的所有特征已经超过了本指南的范围,我们将使用三个简单的媒体应用程序来学习此框架的构建模块。通过这个方法,本指南将为你未来学习和实施更多特殊的应用提供准备。
我应该使用此指南吗?
本指南会带你学习使用JMF工作的基础。为完成这些,我们会创建三个的独立工作的例程序。每个例子都会建立前一个例子的基础上,显示JMF功能性的不同方面。
在本指南中的例子假定你曾经使用过并且已经熟悉了Java程序语言。除了Java核心和JMF的类之外,我们会使用一些Java AWT和Swing类(用于创建GUI),也会有一些Java网络类(用于在网络中传输媒体)。对GUI和网络类一些熟悉有助于你更快的明白观点和这里的例子,但并非是阅读本指南必须的。
我们将学习的例程序如下
· 一个简单的音频播放器(JMF的HelloWorld应用):这个字符界面的播放器通过在命令行中简单的输入媒体文件的名字就可以播放大多数的音频类型。此音频播放器的演示大体上显示了JMF的特有的类。
· 一个图形界面的媒体播放器:我们将使用JMF内置的接口组件来建立图形界面,所以在此练习中必须有一些图形界面的编程经验。这个媒体阅览器演示使用了一些Java AWT和Swing类来为用户显示图形组件。
· 一个媒体广播应用:此应用程序允许一个本地媒体文件通过网络传播。此程序能灵活的使媒体只传输到指定的网络节点,或者传输到一个子网络中的所有节点。此演示使用了一些Java的网络APIs来在网络中传输媒体。
作为第三个练习的一部分,我们将修改图形界面的播放器,让其能接收并且播放媒体。
跳至23页观看Resources,文章,指南,和其他参考书目的列表,这会帮助你学习到更到关于此指南包括的主题。
安装需求
要运行此指南中的例程序,你需要如下的工具和组件:
· Java 2 平台,标准版,编译和运行演示程序
· Java媒体框架,版本2.1.1a或者更高
· 一块已经安装并且配置号的适当的声卡
· 一台或者多台测试机器
· 演示的源代码文件在mediaplayer.jar中
最后的一个演示应用显示了JMF在网络中的应用。如果需要,此演示能运行在一个独立的机器上,使用此机器即是传输方也是接收方。可是要观察到在网络中使用JMF的所有功能,你仍然需要至少两台联网的机器。
在23页中的Resources可下载Java 2平台,完整的源代码文件,以及其他一些完成本指南所需要的工具。
下载安装文件
将JMF安装到你的计算机中的第一步是在JMF的主页中下载安装文件,它同样包括了JMF源代码和API文档的链接。23页的Resources中有下载JMF的链接。
目前,JMF有Windows, Solaris, Linux等版本,以及可运行在任何装有虚拟机的计算机上一个纯Java版本。为了增加性能,你需要下载一个与你操作系统所适应的版本。任何在一个操作系统JMF版本下书写和编译的代码都可以方便的移植到另外的操作系统上。例如,如果你下载了一个Solaris版本的JMF并且编译了一个类,这些类就可以在Linux上使用,不会有任何问题。
作为选择,你可以选择下载纯Java版本,或者跨平台版本的JMF。这些版本没有使用操作系统特有的库文件。如果没有合适的JMF版本适合的操作系统,那么跨平台版本就是一个不错的选择。
安装JMF
下载完JMF安装程序后,双击安装程序的图标。
大部分安装程序都会有个选项,安装本地库到系统目录中;例如,Windows版本安装程序会有一个选项“Move DLLs to Windows/System directory.”。最好将此选项选中,因为它能确保这些操作系统的库文件能正确的安装
在安装的过程中,你还需要选择项目来更新系统的CLASSPATH和PATH变量。如果这些选项被关闭,那么在你编译和运行本指南的例程序的时候就需要在classpath中引入JMF的jar文件。
第二节. 一个简单的音频播放器
浏览
在本节中,我们将进行创建一个简单的音频播放器的第一个练习。本例将介绍Manager类和Player接口,中两个都是建立大多数基于JMF应用的重要部分。
本例的功能目标是在字符界面下播放本地的音频文件。我们将学习此源代码,并了解每一行所做的任务。完成本节后,你将会有一个基于JMF的可播放包括MP3, WAV, AU等多种音频文件的演示程序。
在本练习后的源代码分类种可查询文件SimpleAudioPlayer.java。
引入必要的类
SimpleAudioPlayer类中包括了一些调用,在其前几行中需要引入所有必要的类:
import javax.media.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;