第一节 关于此指南
此指南包含的内容?
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来在网络中传输媒体
作为第三个练习的一部分我们将修改图形界面的播放器让其能接收并且播放媒体
跳至页观看Resources文章指南和其他参考书目的列表这会帮助你学习到更到关于此指南包括的主题
安装需求
要运行此指南中的例程序你需要如下的工具和组件
·Java 平台标准版编译和运行演示程序
·Java媒体框架版本a或者更高
· 一块已经安装并且配置号的适当的声卡
· 一台或者多台测试机器
· 演示的源代码文件在mediaplayerjar中
最后的一个演示应用显示了JMF在网络中的应用如果需要此演示能运行在一个独立的机器上使用此机器即是传输方也是接收方可是要观察到在网络中使用JMF的所有功能你仍然需要至少两台联网的机器
在页中的Resources可下载Java 平台完整的源代码文件以及其他一些完成本指南所需要的工具
下载安装文件
将JMF安装到你的计算机中的第一步是在JMF的主页中下载安装文件它同样包括了JMF源代码和API文档的链接页的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的可播放包括MP WAV AU等多种音频文件的演示程序
在本练习后的源代码分类种可查询文件SimpleAudioPlayerjava
引入必要的类
SimpleAudioPlayer类中包括了一些调用在其前几行中需要引入所有必要的类
import dia*;
import javaioFile;
import javaioIOException;
import URL;
import MalformedURLException;
The dia包是由JMF定义的多个包之一dia是一个核心包包括了定义Manager类和Player接口等本节中我们主要学习Manager类和Player接口其余的dia类放在后面的章节中
除了引入dia声明外以上的代码片断引入了一些创建媒体播放器的输入的声明
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 IOExceptionNoPlayerExceptionCannotRealizeException {audioPlayer = ManagercreateRealizedPlayer(url);}public SimpleAudioPlayer(File file) throws IOExceptionNoPlayerExceptionCannotRealizeException {this(filetoURL());}
如果你看完本节的代码你可以注意到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 playeraudioPlayer = ManagercreateRealizedPlayer(url);
启动和停止Player
设定一个Player实例的启动或是停止就如同调用Player的一个简单的认证方法如下所示
public void play() {audioPlayerstart();}public void stop() {audioPlayerstop();audioPlayerclose();}
调用SimpleAudioPlayer类中的play()方法来实现调用Player实例的start()方法调用此方法后你能听到本地的喇叭的声音文件同样的stop()方法使player停止并且关闭掉Player对象
对于读取和或者播放本地媒体文件来说关闭Player实例释放所有资源是一个有用的方法因为这是一个简单的例子关闭Player是终止一个会话可接受的方法但是在实际的应用中你需要小心的确认在除掉Player之前必须要关闭掉一但你已经关闭掉player在再次播放一个媒体之前你必须要创建一个新的Player实例(等待它的状