第一节. 关于此指南
此指南包含的内容?
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;
the javax.media包是由jmf定义的多个包之一。javax.media是一个核心包,包括了定义manager类和player接口等。本节中,我们主要学习manager类和player接口,其余的javax.media类放在后面的章节中。
除了引入javax.media声明外,以上的代码片断引入了一些创建媒体播放器的输入的声明。
player接口
在下面的代码片断中,创建一个公共类simpleaudioplayer并举例定义一个player变量:
public class simpleaudioplayer {private player audioplayer = null;
术语player听起来由点熟悉,因为它是建立在我们公用的音频或者视频播放器的基础上的。事实上,这个接口的例子就像是当作它们的真实的副本。players揭示了一个实体上的媒体播放器(如立体音箱系统或者vcr)涉及到功能上的方法。例如,一个jmf媒体播放器可以开始和结束一个媒体流。在本节种,我们将使用player的开始和结束功能。
在一个文件上创建一个player
使用jmf获得一个特定媒体文件的player实例非常简单。manager类在jmf中如同一个工厂制作许多的特殊接口类型,包括player接口。因此,manager类的责任就是创建player实例,如下例:
public simpleaudioplayer(url url) throws ioexception,noplayerexception,cannotrealizeexception {audioplayer = manager.createrealizedplayer(url);}public simpleaudioplayer(file file) throws ioexception,noplayerexception,cannotrealizeexception {this(file.tourl());}
如果你看完本节的代码,你可以注意到manager类包含了创建一个player实例的其他方法。我们会研究其中的一些,如在后面的章节中的datasource或者medialocator的实例化。
player的状态
jmf定义了大量的一个player实例可能存在的不同状态。如下:
? prefetched
? prefetching
? realized
? realizing
? started
? unrealized
使用这些状态
因为使用媒体常常是资源非常密集的,由jmf对象揭示的许多方法都是不闭塞的,允许一系列事件监听的状态改变的异步通知。例如,一个player在它可以启动之前,必须经过prefetched和realized状态。由于这些状态的改变都需要一些时间来完成,jmf媒体应用可以分配一个线程来初始化创建player实例,然后再继续其他的操作。当player准备就绪的时候,它会通知应用程序其状态已经改变。
在一个如同我们的这样简单的程序中,多功能性的类型并不是很重要。处于这个原因,manager类也提供了一些创建realized player的有用方法。调用一个createrealizedplayer()方法来阻塞调用线程,直到player达到realized状态。为了调用一个无阻塞的创建player的方法,我们在manager类中使用了一个createplayer()方法。下面的一行代码中创建了一个我们需要在例程序中使用的
realized player:audioplayer = manager.createrealizedplayer(url);
启动和停止player
设定一个player实例的启动或是停止就如同调用player的一个简单的认证方法,如下所示:
public void play() {audioplayer.start();}public void stop() {audioplayer.stop();audioplayer.close();}
调用simpleaudioplayer类中的play()方法来实现调用player实例的start()方法。调用此方法后,你能听到本地的喇叭的声音文件。同样的,stop()方法使player停止并且关闭掉player对象。
对于读取和或者播放本地媒体文件来说,关闭player实例释放所有资源是一个有用的方法。因为这是一个简单的例子,关闭player是终止一个会话可接受的方法。但是在实际的应用中,你需要小心的确认在除掉player之前必须要关闭掉。一但你已经关闭掉player,在再次播放一个媒体之前你必须要创建一个新的player实例(等待它的状
闽公网安备 35060202000074号