如果想要使用Java中的Swing播放音乐,视频,包括录音,截取录像等等,就要用到Java的媒体框架JMF。

Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节。JMF API的使用相对比较简单,但是能够满足几乎所有多媒体编程的需求。在这篇文章中,我将向你介绍如何用很少的代码就编写出多媒体程序。

Java多媒体框架(JMF)中包含了许多用于处理多媒体的API。它是一个相当复杂的系统,完全了解这个系统可能需要花上几周的时间,但是这篇文章将主要介绍JMF的几个核心接口和类,然后通过一个简单的例子向你展示如何利用该接口进行编程。

JMF目前的最新版本是2.1,Sun通过它向Java中引入处理多媒体的能力。下面是JMF所支持的功能的一个概述:

● 可以在Java Applet和应用程序中播放各种媒体文件,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等文件。

● 可以播放从互联网上下载的媒体流。

● 可以利用麦克风和摄像机一类的设备截取音频和视频,并保存成多媒体文件。

● 处理多媒体文件,转换文件格式。

● 向互联网上传音频和视频数据流。

● 在互联网上广播音频和视频数据。

JMF的结构

为 了更好地说明JMF的结构,让我们用立体声音响做一个简单的比喻。当你CD机播放CD唱片的时候,CD唱片向系统提供音乐信号。这些数据是在录音棚中用麦 克风和其他类似的设备记录下来的。CD播放机将音乐信号传送到系统的音箱上。在这个例子中,麦克风就是一个音频截取设备,CD唱片是数据源,而音箱是输出 设备。

JMF的结构和立体声音响系统非常相似,在后面的文章中,你会遇到下面的这些术语:

● 数据源(Data source)

● 截取设备(Capture Device,包括视频和音频截取设备)

● 播放器(Player)

● 处理器(Processor)

● 数据格式(Format)

● 管理器(Manager)

下面让我们来看一看这些术语到底代表什么意思。

1.数据源

就 像CD中保存了歌曲一样,数据源中包含了媒体数据流。在JMF中,DataSource对象就是数据源,它可以是一个多媒体文件,也可以是从互联网上下载 的数据流。对于DataSource对象,一旦你确定了它的位置和类型,对象中就包含了多媒体的位置信息和能够播放该多媒体的软件信息。当创建了 DataSource对象后,可以将它送入Player对象中,而Player对象不需要关心DataSource中的多媒体是如何获得的,以及格式是什 么。

在某些情况下,你需要将多个数据源合并成一个数据源。例如当你在制作一段录像时,你需要将音频数据源和视频数据源合并在一起。JMF支持数据源合并,在后面的例子中我们将提到这一点。

2.截取设备

截取设备指的是可以截取到音频或视频数据的硬件,如麦克风、摄像机等。截取到的数据可以被送入Player对象中进行处理。

3.播放器

在 JMF中对应播放器的接口是Player。Player对象将音频/视频数据流作为输入,然后将数据流输出到音箱或屏幕上,就像CD播放机读取CD唱片中 的歌曲,然后将信号送到音箱上一样。Player对象有多种状态,JMF中定义了JMF的六种状态,在正常情况下Player对象需要经历每个状态,然后 才能播放多媒体。下面是对这些状态的说明。

● Unrealized:在这种状态下,Player对象已经被实例化,但是并不知道它需要播放的多媒体的任何信息。

● Realizing:当调用realize()方法时,Player对象的状态从Unrealized转变为Realizing。在这种状态下,Player对象正在确定它需要占用哪些资源。

● Realized:在这种状态下Player对象已经确定了它需要哪些资源,并且也知道需要播放的多媒体的类型。

● Prefetching:当调用prefectch()方法时,Player对象的状态从Realized变为Prefetching。在该状态下的 Player对象正在为播放多媒体做一些准备工作,其中包括加载多媒体数据,获得需要独占的资源等。这个过程被称为预取(Prefetch)。

● Prefetched:当Player对象完成了预取操作后就到达了该状态。

● Started:当调用start()方法后,Player对象就进入了该状态并播放多媒体。

4.处理器

处 理器对应的接口是Processor,它一种播放器。在JMF API中,Processor接口继承了Player接口。 Processor对象除了支持支持Player对象支持的所有功能,还可以控制对于输入的多媒体数据流进行何种处理以及通过数据源向其他的Player 对象或Processor对象输出数据。

除了在播放器中提到了六种状态外,Processor 对象还包括两种新的状态,这两种状态是在Unrealized状态之后,但是在Realizing状态之前。

● Configuring:当调用configure()方法后,Processor对象进入该状态。在该状态下,Processor对象连接到数据源并获取输入数据的格式信息。

● Configured:当完成数据源连接,获得输入数据格式的信息后,Processor对象就处于Configured状态。

5.数据格式

Format 对象中保存了多媒体的格式信息。该对象中本身没有记录多媒体编码的相关信息,但是它保存了编码的名称。Format的子类包括AudioFormat和 VideoFormat类,ViedeoFomat又有六个子类:H261Format、H263Format、IndexedColorFormat、 JPEGFormat、RGBFormat和YUVFormat类。

6.管理器

JMF提供了下面四种管理器:

● Manager:Manager相当于两个类之间的接口。例如当你需要播放一个DataSource对象,你可以通过使用Manager对象创建一个 Player对象来播放它。使用Manager对象可以创建Player、Processor、DataSource和DataSink对象。

● PackageManager:该管理器中保存了JMF类注册信息。

● CaptureDeviceManager:该管理器中保存了截取设备的注册信息。

● PlugInManager:该管理器中保存了JMF插件的注册信息。

创建一个Player对象

在 JMF编程中,最常见的工作就是创建一个Player对象。你可以通过Manager类的createPlayer()方法创建Player对象。 Manager对象使用多媒体的URL或MediaLocator对象来创建Player对象。当你获得了一个Player对象后,你可以通过调用 getVisualComponent()方法得到Player对象的图像部件(Visual Component,在图像部件上可以播放多媒体的图像)。然后将图像部件加入到应用程序或Applet的界面上。Player对象还包含一个控制面板, 在上面可以控制媒体的播放、停止和暂停等。

Player类中的很多方法只有在Player对象处于Realized的状态下才会被调用。 为了保证Player对象已经到达了该状态,你需要使用Manager的createRealizePlayer()方法来获得Player对象。但是对 于start()方法来说,你可以在Player对象到达Prefetched状态之前调用它,它可以自动将Player的状态转换到Started状 态。

截取多媒体数据

多媒体数据的截取是JMF程序中另一个非常重要的功能。你可以按照下面的步骤截取数据:

● 通过查询CaptureDevieceManager获得你希望使用的截取设备。

● 获得设备对应的CaptureDeviceInfo对象。

● 从CaptureDeviecInfo对象中获得MediaLocator对象,然后用它创建一个DataSource对象。

● 使用DataSource对象创建Player对象或Processor对象。

● 调用start()方法,开始截取多媒体数据。

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

Win下安装JMF2.1

当你使用JMF进行编程以前,你需要安装JMF。同时在硬件 上也有一些要求。由于本文的代码是在Windows 2000下编写和测试,因此文章中提到的操作系统需要的软件都是与Windows有关的。虽然Java是跨平台的,但是JMF是个例外——并不是所有的平 台上都实现了JMF。

硬件和软件要求

硬件方面你需要与SoundBlaster兼容的声卡,芯片最好使用奔腾III以上的芯片。内存最好不小于64MB。同时你需要安装下面的软件:

● Win7,Windows NT 4.0, Windows2000或 WindowsXP。

● 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

如 果你希望使用视频和音频截取的设备,你需要确认安装了这些设备的驱动程序。除此之外,你还需要运行JMFRegistry应用程序。 JMFRegistry可以向JMF注册新的数据源、媒体处理器、插件、视频和音频截取设备,然后你才能够在你的程序中使用它们。你只需要运行一次 JMFRegistry就能注册系统中所有的视频和音频截取设备。

当你运行了JMFRegistry后,会弹出图一所示的窗口:

图一 通过JMFRegistry注册视频和音频截取设备(未安装视频)

选 择“Capture Devices”标签,然后按下“Detect Capture Devices”按钮,程序将自动检测出系统中的视频和音频截取设备。在左边的类表框中会列出所有检测到的设备的名称。在图一中我们看到 JMFRegsitery发现了JavaSound audio capture、vfw:Logitech USB Video Camera:0和vfw:Microsoft WDM Image Capture (Win32):1。单击某个设备可以看到该设备支持的视频或音频格式。如果JMFRegistry无法检测到设备,有可能是没有正常安装设备的驱动程序。

Java 媒体框架 之 JMF相关推荐

  1. Java媒体框架(JMF)资料

    Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节.JMF API的使用相对比较简单,但是能够满足几乎所有多媒体编程的需求.在这篇文章中,我将向你介绍如何用很少 ...

  2. Java媒体框架(JMF)

    Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节.JMF API的使用相对比较简单,但是能够满足几乎所有多媒体编程的需求.在这篇文章中,我将向你介绍如何用很少 ...

  3. Java媒体框架(JMF),个人很欣赏.... (转)

    2019独角兽企业重金招聘Python工程师标准>>> Java媒体框架(JMF),个人很欣赏.... Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复 ...

  4. java 媒体框架_Java 媒体框架 之 JMF

    如果想要使用Java中的Swing播放音乐,视频,包括录音,截取录像等等,就要用到Java的媒体框架JMF. Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节 ...

  5. 让JAVA活起来----很欣赏(JMF媒体框架)

    Java媒体框架(JMF)使你能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节.JMF API的使用相对比较简单,但是能够满足几乎所有多媒体编程的需求.在这篇文章中,我将向你介绍如何用很少 ...

  6. JMF(Java多媒体框架)资料汇总

    JMF(Java多媒体框架)其实也是Oracle开发的相应的开发包,方便程序员编写多媒体相关的应用程序,本身有一定的历史了.在64位系统下使用,需要多加了解.大家学习一个具体的开发包,如JMF,首先花 ...

  7. JMF介绍之媒体框架

    JMF(Java Media Framework) 是Sun 公司提出的Java 媒体架构.它是对应Java 2 平台标准版(J2SE) 的一种可选用的应用编程接口(API) .JMF 的源代码通过S ...

  8. java开源框架总结

    Java开源框架集 Spring Framework [Java开源 J2EE框架] Spring 是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且 ...

  9. 基于java SSM框架+微信小程序实现电子书城阅读器演示【附项目源码+论文说明】分享

    基于java SSM框架+微信小程序实现电子书城阅读器演示 摘要 而随着互联网技术的不断发展,互联网已经渗入到我们生活中的各个方面.移动设备的普及使我们的生活发生了翻天覆地的变化,这种变化也深刻影响着 ...

最新文章

  1. matlab径向分布函数作图_分子动力学的径向分布函数绘制
  2. 权限组件(4):给动态菜单增加面包屑导航
  3. 配置管理小报100629:我是项目组成员,事情比较急,按流程需要项目经理批准,但项目经理不在怎么办?...
  4. ubuntu18.04的ifconfig输出没有ip地址
  5. SQL里学习通配符时LIKE和RLIKE的区别
  6. JS----JavaScript中防抖和节流知识概述
  7. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
  8. Oracle递归查询,Oracle START WITH……CONNECT BY查询
  9. TrueCrypt 密码找回工具
  10. 源码分析——ConcurrentHashMap
  11. 【Java工具类】非对称加密之RSA算法工具类(分段处理)
  12. linux修复windows,Linux十大妙用:充当Windows修复工具
  13. 获取所有权_住房所有权经济学深入研究
  14. ps 索引模式 导出变成了白色背景
  15. I'm coming now.
  16. 关于弱酸性次氯酸水,你需要了解更多!
  17. KK 给年轻人的99条建议
  18. 求互质数对的两种方法:欧拉函数和容斥原理
  19. c语言主函数如何调用其他函数,SOS、、、、在主函数中调用其他函数
  20. 宝塔Linux面板的搭建

热门文章

  1. HttpClient数据传输的编码方式
  2. 按文件名批量分类文件到文件夹
  3. 在SAP系统中,更改一个公司代码(Company Code)的会计科目表(Chart of Accounts)
  4. Python文字转换语音,抠脚大汉秒变撒娇萌妹
  5. 拓扑容差如何修改_如何在CAD中通过设置容差参数对多段线进行自动修复重构
  6. python在园林中的应用_攀缘植物在园林中的应用
  7. Linux使用C语言实现ls命令
  8. Codeforces Round #672 (Div. 2) C2 - Pokémon Army (hard version)(贪心,维护变化值)
  9. 初中生直升高中定下来了?预计2023年全面落实?教育部的回应来了
  10. 梯度,散度,旋度的具体物理意义