java多媒体编程_第1页
java多媒体编程_第2页
java多媒体编程_第3页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、java 多媒体编程Java 媒体框架( JMF) 资料分类 :技术文摘Java 媒体框架 ( JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节。JMF API 的使用相对比较简单,但是能够满足几乎所有多媒体编程的需求。在这篇文章中,我将向你介绍如何用很少的代码就编写出多媒体程序。Java 多媒体框架( JMF)中包含了许多用于处理多媒体的API 。它是一个相当复杂的系统,完全了解这个系统可能需要花上几周的时间,但是这篇文章将主要介绍JMF的几个核心接口和类,然后通过一个简单的例子向你展示如何利用该接口进行编程。JMF目前的最新版本是2.1,Sun通过它向Java 中引

2、入处理多媒体的能力。下面是JMF所支持的功能的一个概述: 可以在Java Applet和应用程序中播放各种媒体文件,例如AU、 AVI、MIDI、 MPEG 、QuickTime 和 WAV 等文件。 可以播放从互联网上下载的媒体流。 可以利用麦克风和摄像机一类的设备截取音频和视频,并保存成多媒体文件。 处理多媒体文件,转换文件格式。 向互联网上传音频和视频数据流。 在互联网上广播音频和视频数据。JMF的结构为了更好地说明JMF 的结构,让我们用立体声音响做一个简单的比喻。 当你 CD 机播放 CD 唱片的时候, CD 唱片向系统提供音乐信号。这些数据是在录音棚中用麦克风和其他类似的设备记录下

3、来的。CD 播放机将音乐信号传送到系统的音箱上。在这个例子中,麦克风就是一个音频截取设备,CD 唱片是数据源,而音箱是输出设备。JMF 的结构和立体声音响系统非常相似,在后面的文章中,你会遇到下面的这些术语: 数据源( Data source) 截取设备(Capture Device ,包括视频和音频截取设备) 播放器( Player) 处理器(Processor) 数据格式( Format) 管理器( Manager) 下面让我们来看一看这些术语到底代表什么意思。1数据源就像 CD 中保存了歌曲一样,数据源中包含了媒体数据流。在 JMF 中, DataSource 对象就是数据源,它可以是一

4、个多媒体文件,也可以是从互联网上下载的数据流。对于DataSource 对象,一旦你确定了它的位置和类型,对象中就包含了多媒体的位置信息和能够播放该多媒体的软件信息。当创建了 DataSource 对象后,可以将它送入Player 对象中,而 Player 对象不需要关心 DataSource 中的多媒体是如何获得的,以及格式是什么。在某些情况下,你需要将多个数据源合并成一个数据源。例如当你在制作一段录像时,你需要将音频数据源和视频数据源合并在一起。JMF 支持数据源合并,在后面的例子中我们将提到这一点。2截取设备截取设备指的是可以截取到音频或视频数据的硬件,如麦克风、摄像机等。截取到的数据可

5、以被送入Player 对象中进行处理。3播放器在 JMF 中对应播放器的接口是Player。Player 对象将音频视频数据流作为输入,然后将数据流输出到音箱或屏幕上,就像 CD 播放机读取CD 唱片中的歌曲,然后将信号送到音箱上一样。 Player 对象有多种状态, JMF 中定义了 JMF 的六种状态,在正常情况下 Player 对象需要经历每个状态,然后才能播放多媒体。下面是对这些状态的说明。 Unrealized :在这种状态下, Player 对象已经被实例化,但是并不知道它需要播放的多媒体的任何信息。 Realizing :当调用 realize()方法时, Player 对象的状

6、态从 Unrealized 转变为 Realizing 。在这种状态下, Player 对象正在确定它需要占用哪些资源。 Realized:在这种状态下 Player 对象已经确定了它需要哪些资源,并且也知道需要播放的多媒体的类型。 Prefetching :当调用 prefectch()方法时, Player 对象的状态从 Realized 变为 Prefetching 。在该状态下的 Player 对象正在为播放多媒体做一些准备工作,其中包括加载多媒体数据,获得需要独占的资源等。这个过程被称为预取 ( Prefetch)。 Prefetched:当 Player 对象完成了预取操作后就到达

7、了该状态。 Started:当调用 start()方法后, Player 对象就进入了该状态并播放多媒体。 4处理器处理器对应的接口是 Processor,它一种播放器。在 JMF API 中, Processor 接口继承了 Player 接口。 Processor 对象除了支持支持 Player 对象支持的所有功能,还可以控制对于输入的多媒体数据流进行何种处理以及通过数据源向其他的 Player 对象或 Processor 对象输出数据。除了在播放器中提到了六种状态外,Processor 对象还包括两种新的状态,这两种状态是在Unrealized 状态之后,但是在 Realizing 状态

8、之前。 Configuring :当调用 configure ()方法后, Processor 对象进入该状态。在该状态下, Processor 对象连接到数据源并获取输入数据的格式信息。 Configured :当完成数据源连接,获得输入数据格式的信息后, Processor 对象就处于 Configured 状态。 5数据格式Format 对象中保存了多媒体的格式信息。该对象中本身没有记录多媒体编码的相关信息,但是它保存了编码的名称。 Format 的子类包括 AudioFormat 和 VideoFormat 类, ViedeoFomat 又有六个子类: H261Format 、 H26

9、3Format 、IndexedColorFormat 、JPEGFormat、RGBFormat 和 YUVFormat类。6管理器JMF 提供了下面四种管理器: Manager: Manager 相当于两个类之间的接口。例如当你需要播放一个 DataSource 对象,你可以通过使用 Manager 对象创建一个 Player 对象来播放它。 使用 Manager 对象可以创建 Player、 Processor、 DataSource 和 DataSink 对象。 PackageManager:该管理器中保存了 JMF 类注册信息。 CaptureDeviceManager :该管理器中

10、保存了截取设备的注册信息。 PlugInManager :该管理器中保存了JMF 插件的注册信息。创建一个 Player 对象在 JMF 编程中,最常见的工作就是创建一个Player 对象。你可以通过 Manager 类的 createPlayer()方法创建 Player 对象。 Manager 对象使用多媒体的 URL 或 MediaLocator 对象来创建 Player 对象。当你获得了一个 Player 对象后,你可以通过调用 getVisualComponent ()方法得到 Player 对象的图像部件( Visual Component ,在图像部件上可以播放多媒体的图像)。然

11、后将图像部件加入到应用程序或Applet 的界面上。 Player 对象还包含一个控制面板,在上面可以控制媒体的播放、停止和暂停等。Player 类中的很多方法只有在Player 对象处于Realized的状态下才会被调用。为了保证Player 对象已经到达了该状态,你需要使用Manager 的 createRealizePlayer()方法来获得 Player 对象。但是对于start()方法来说, 你可以在 Player对象到达 Prefetched 状态之前调用它,它可以自动将Player的状态转换到Started 状态。截取多媒体数据多媒体数据的截取是 JMF 程序中另一个非常重要的功

12、能。你可以按照下面的步骤截取数据: 通过查询 CaptureDevieceManager 获得你希望使用的截取设备。 获得设备对应的CaptureDeviceInfo 对象。 从 CaptureDeviecInfo 对象中获得 MediaLocator 对象,然后用它创建一个 DataSource 对象。 使用 DataSource 对象创建Player 对象或 Processor 对象。 调用 start()方法,开始截取多媒体数据。你可以使用CaptureDeviceManager 对象获得系统中可用的视频和音频截取设备。通过调用getDeviceList ()方法你可以获得设备的列表。每

13、个设备都对应一个CaptrueDeviceInfo 对象。也可以通过调用 CaptureDevieceManager 对象的 getDevice ()方法来获得特定的 CaptureDeviceInfo 对象。在使用设备截取多媒体数据前,还需要从 CaptureDeviceInfo 对象中获得设备对应的MediaLocator对象。然后你可以直接使用MediaLocator来构造 Player 或 Processor 的实例,也可以用MediaLocator 构造一个 DataSource 对象,然后将DataSource 对象送入Player或 Processor 对象中。 最后调用 sta

14、rt()方法来截取多媒体数据。一个 JMF 例子当你使用 JMF 进行编程以前,你需要安装JMF 。同时在硬件上也有一些要求。由于本文的代码是在Windows 2000下编写和测试,因此文章中提到的操作系统需要的软件都是与 Windows 有关的。虽然 Java 是跨平台的,但是 JMF 是个例外 ?并不是所有的平台上都实现了 JMF。硬件和软件要求硬件方面你需要与 SoundBlaster 兼容的声卡,芯片最好使用奔腾 III 以上的芯片。 内存最好不小于 64MB 。同时你需要安装下面的软件: Windows95/98 ,Windows NT 4.0, Windows2000或Window

15、sXP 。 JDK1.1.6 或以上的 Windows 版本。 JMF 类和动态库 在 Windows 下安装 JMF2.1当下载了 JMF2.1 以后,运行jmf-2_1_1b-windows-i586.exe 。该程序会将JMF2.1 安装到你指定的目录下。当安装成功后,你需要确认一下安装程序正确设定了 CLASSPATH 和 PATH 环境变量。在 CLASSPATH 中需要包含 jmf.jar 和 sound.jar;在 PATH 中需要包含 JMF动态库的路径。JMFRegistry如果你希望使用视频和音频截取的设备,你需要确认安装了这些设备的驱动程序。除此之外,你还需要运行JMFR

16、egistry 应用程序。 JMFRegistry 可以向 JMF 注册新的数据源、媒体处理器、插件、视频和音频截取设备,然后你才能够在你的程序中使用它们。你只需要运行一次JMFRegistry就能注册系统中所有的视频和音频截取设备。当你运行了JMFRegistry 后,会弹出图一所示的窗口:图一通过 JMFRegistry 注册视频和音频截取设备选择 “Capture Devices” 标签,然后按下“Detect Capture Devices” 按钮,程序将自动检测出系统中的视频和音频截取设备。在左边的类表框

17、中会列出所有检测到的设备的名称。在图一中我们看到JMFRegsitery 发现了 JavaSound audio capture、vfw:LogitechUSB Video Camera:0 和 vfw:Microsoft WDM Image Capture(Win32):1 。单击某个设备可以看到该设备支持的视频或音频格式。如果JMFRegistry 无法检测到设备,有可能是没有正常安装设备的驱动程序。例子程序由于JMF2.1比较复杂,我不可能在在例子中包含JMF2.1支持的所有功能。 因此我选择了下面几个在JMF中比较常用的功能 :播放多媒体、 注册音频和视频截取设备、截取视频和音频。1播

18、放多媒体在 JMF.java 中有一个 play()方法。该方法可以播放用户选择的多媒体文件。当播放多媒体文件时,你需要一个Player 对象。在例子中, dualPlayer 就是 Player 接口的实现对象。Player dualPlayer;在 Play()方法中,通过使用 FileDialog 获得媒体文件的路径和文件名,并保存在 filename 中。try FileDialog fd =new FileDialog(this, "Select File", FileDialog.LOAD); fd.show();String filename = fd.get

19、Directory() + fd.getFile();.catch (Exception e) System.out.println(e.toString();然后你需要通过媒体管理器Manager 间接创建一个Player对象。你可以使用Manager 类的 createPlayer()方法或者createProcessor()方法来获得一个Player 对象或 Processor对象。在 play()方法中, 我使用的是 createPlayer()方法。 dualPlayer = Manager.createPlayer(new MediaLocator("file:/&quo

20、t; + filename);有时你需要使用一个 Player 对象来控制多个其他的 Player 和 Controller 对象,我们把这个 Player 对象称为主对象, 并把这些对象组成一个组。通过调用主对象中的start()、stop()、setMediaTime ()等方法就可以激活组中所有成员的相应方法。主对象控制所有的状态变化和事件发布。然后使用addControllerListerner ()方法来将一个ControllerListener 对象绑定到 Player 对象上, Controller 对象将向该ControllerListener 对象发送事件消息。dualPla

21、yer.addControllerListener(this);最后需要调用 start()方法来启动 Player 对象。 start()方法将 Player 对象的状态设置为 Started。如果 Player 没有被实体化( Realize)或预取( Prefetch), start()方法会自动执行这些操作。dualPlayer.start();由于 JMF 类实现了 ControllerLister 接口,因此需要实现该接口中的 controllerUpdate ()方法,该方法在 Controller 对象产生一个事件时被调用。 public synchronized voidco

22、ntrollerUpdate(ControllerEvent event) if (event instanceof RealizeCompleteEvent) Component comp;if (comp = dualPlayer.getVisualComponent() != null)add ("Center", comp);if (comp = dualPlayer.getControlPanelComponent() !=null)add("South", comp);validate();当 JMF 类产生了一个 RealizeComple

23、teEvent 事件后,controllerUpdate()方法在界面上增加两个Component 对象,一个用于播放媒体,一个用于放置控制按钮,例如播放、停止等。在运行程序的过程中,程序会产生下面的输出。Startingplayer .javax.media.TransitionEventsource=com.sun.media.content.video.mpeg.Handler71bb78,previous=Unrealized,current=Realizing,target=StartedOpen log file: C:testJavaJMFJMFjmf.log javax.med

24、ia.DurationUpdateEventsource=com.sun.media.content.video.mpeg.Handler71bb78,duration=javax.media.Time2a37a6javax.media.RealizeCompleteEventsource=com.sun.media.content.video.mpeg.Handler71bb78,previous=Realizing,current=Realized,target=StartedAdding visual componentAdding control paneljavax.media.Tr

25、ansitionEventsource=com.sun.media.content.video.mpeg.Handler71bb78,previous=Realized,current=Prefetching,target=Startedjavax.media.PrefetchCompleteEventsource=com.sun.media.content.video.mpeg.Handler71bb78,previous=Prefetching,current=Prefetched,target=Startedjavax.media.StartEventsource=com.sun.med

26、ia.content.video.mpeg.Handler71bb78,previous=Prefetched,current=Started,target=Started,mediaTime=javax.media.Time56a05e,timeBaseTime=javax.media.Time3a8602javax.media.EndOfMediaEventsource=com.sun.media.content.video.mpeg.Handler71bb78,previous=Started,current=Prefetched,target=Prefetched,mediaTime=

27、javax.media.Time1d332b前面提到,当调用 start()方法的时候, Player 会切换到Started状态。从上面列出的信息中可以看到Player 对象的状态从Unrealized 变成了 Started。当 EndOfMedia 事件被激活时 (这时 Player 对象完成了媒体文件的播放) ,状态从 Started 变成了 Prefetched。图二显示了程序正在播放多媒体文件时的情况。 图二 程序正在播放媒体文件2注册音频和视频截取设备库在例子中,注册音频和视频截取设备的方法只在程序的内部注册这些设备,在程序外则不起作用。该方法的作用是当用户的计算机上存在多和音频

28、和视频截取设备时,告诉程序因该使用哪个设备和这些设备支持的音频和视频格式。因此在进行截取处理之前需要获得设备的配置信息。在例子中,当在 Configure 菜单上按下Capture Device 命令后, 会弹出 CaptureDeviceDialog 对话框。如果在截取音频或视频前没有设定设备的配置,也会弹出该对话框。图三显示了该对话框。图三设备注册对话框让我们来看一下CaptureDeviceDialog 类中的 init ()方法:在初始化了界面之后,通过调用CaptureDeviceManager 类的getDeviceList ()方法:devices = CaptureDevice

29、Manager.getDeviceList ( null ); CaptureDeviceManager 类使用查询机制和一个注册表来定位设备,然后将设备的信息放入CaptureDeviceInfo 对象中返回。我们还可以利用CaptureDeviceManager 类来注册新的设备。通过调用getDeviceList ()方法程序获取了一个支持指定格式的设备的列表。在例子中, 我将格式参数设定为null ,这意味着设备可以使用任何格式。返回值被放入device 变量中。如果 getDeviceList ()方法返回的是一个非空值,程序会将包含在其中的音频设备名称和视频设备名称分别放入两个下拉

30、列表中中,但是到目前为止我们还不知道哪些设备是音频设备,哪些是视频设备。我们可以通过 CaptureDeviceInfo 的 getFormat()方法获得 Format 对象组数,在 Format 对象中保存了设备支持的媒体格式。 Format 类间接被 AudioFormat 和 VideoFormat 类所继承。因此我们可以利用设备支持的格式类型来区分设备的类型:if (devices!=null && devices.size()>0) int deviceCount = devices.size();audioDevices = new

31、Vector();videoDevices = new Vector();Format formats;for ( int i = 0;i < deviceCount;i+ ) cdi = (CaptureDeviceInfo) devices.elementAt ( i ); formats = cdi.getFormats();for ( int j=0;j<formats.length; j+ ) if ( formatsj instanceof AudioFormat ) audioDevices.addElement(cdi);break;else if

32、(formatsj instanceof VideoFormat ) videoDevices.addElement(cdi);break;. . .上面的程序运行后,audioDevices()中将包含所有的音频设备, videoDevices ()中将保存所有的视频设备。其中cdi是 CaptureDeviceInfo 对象。然后将设备名称填入下拉列表中:/ 将音频设备显示在下拉列表中for (int i=0; i<audioDevices.size(); i+) cdi= (CaptureDeviceInfo)audioDevices.elementAt(i);audioD

33、eviceCombo.addItem(cdi.getName();/ 将视频设备显示在下拉列表中for (int i=0; i<videoDevices.size(); i+) cdi= (CaptureDeviceInfo)videoDevices.elementAt(i);videoDeviceCombo.addItem(cdi.getName();然后程序显示出当前选中的设备支持的格式:displayAudioFormats();displayVideoFormats();下一步需要获取用户选中的音频设备和视频设备以及它们支持的格式,相关的方法是JMF 类中的 getAud

34、ioDevice ()、getVideoDevice ()、 getAudioFormat ()和 getVideoFormat()方法。然后将获取的对象分别保存到audioCDI ,videoCDI , audioFormat 和 videoFormat 中:audioCDI = cdDialog.getAudioDevice();if (audioCDI!=null) audioDeviceName = audioCDI.getName(); System.out.println("Audio Device Name: " +audioDeviceName);video

35、CDI = cdDialog.getVideoDevice();if (videoCDI!=null) videoDeviceName = videoCDI.getName(); System.out.println("Video Device Name: " +videoDeviceName);/ 获得选中的多媒体格式videoFormat = cdDialog.getVideoFormat(); audioFormat = cdDialog.getAudioFormat();3截取视频和音频使用 capture()方法可以截取音频和视频数据。但是在使用该方法前需要确定是否已经选中了视频和音频截取设备:if (audioCDI=null && videoCDI=null)registerDevices();和 play()方法类似,可以通过使用Manger 类中的静态方法 createPlayer()创建一个 Player 对象,该对象可以播放一个 DataSource 对象中的数据流。Player createPlayer(MediaLocator sourceLocator)在例子中,我首先通过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论