文件接收柜tcp课程源码基础教程_第1页
文件接收柜tcp课程源码基础教程_第2页
文件接收柜tcp课程源码基础教程_第3页
文件接收柜tcp课程源码基础教程_第4页
文件接收柜tcp课程源码基础教程_第5页
已阅读5页,还剩12页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、Java架构基础内容表格1.2.3.4.5.6.关于此指南一个简单的音频 JMF 用户接口组件 JMF 概念和接收 总结以及资源器第一节. 关于此指南此指南包含的内容?Java架构(JMF)是一个令人激动的通用的 API,它允许 Java 开发者用许多不同的方法处理。本指南主要通过使用工作的例子提供一个 JMF 的一些主要的特征的概述。阅读完本指南后,你将会明白 JMF 体系结构中的主要功能。你同样能正确的使用 JMF,使用现存的例子和可为特殊功能扩展的源代 码。本指南包含着以下:和安装 JMF主要的 JMF 类以及它们在 JMF 体系结构中的应用本地的文件为的存取和操作制作以和图形用户界面(

2、GUI)通过网络通过网络接收几乎所有的类型的操作和处理都可以通过 JMF 来实现。全面的JMF 所提应用程序来供的所有特征已经超过了本指南的范围使用三个简单的学习此框架的构建模块。通过这个方法,本指南将为你未来学习和实施的应用提供准备。我应该使用此指南吗?特殊本指南会带你学习使用 JMF 工作的基础。为完成这些,会创建三个的独立工作的例程序。每个例子都会建立前一个例子的基础上,显示 JMF 功能性的不同方面。在 本指南中的例子假定你曾经使用过并且已经熟悉了 Java 程序语言。除了 Java和 JMF 的类之外,会使用一些 Java AWT 和 Swing 类(用于创建 GUI),也会有一些

3、Java 网络类(用于在网络中传输)。对 GUI 和网络类一些熟悉有助于你更快的明白观点和这里的 例子,但并非是阅读本指南必须的。学习的例程序如下 一个简单的音频器(JMF 的oWorld 应用):这个字符界面的器通频过在命令行中简单的输入文件的名字就可以大多数的音频类型器的演示大体上显示了 JMF 的特有的类。 一个图形界面的器:使用 JMF 内置的接口组件来建立图形界面,所以在此练习中必须有一些图形界面的编程经验。这个了一些 Java AWT 和 Swing 类来为用户显示图形组件。阅览器演示使用 一个广播应用:此应用程序允许一个本地文件通过网络。此程序能灵活的使只传输到指定的网络节点,或

4、者传输到一个子网络中的所有节点。此演示使用了一些 Java 的网络 APIs 来在网络中传输。作为第三个练习的一部分,。修改图形界面的器,让其能接收并且跳至 23 页Resour,文章,指南,和其他参考书目的列表,这会帮助你学习到更到关于此指南包括的。安装需求要运行此指南中的例程序,你需要如下的工具和组件:Java 2 Java,标准版,编译和运行演示程序框架,版本 2.1.1a 或者更高一块已经安装并且配置号的适当的声卡一台或者多台测试机器演示的源代码文件在 mediaplayer.jar 中最后的一个演示应用显示了 JMF 在网络中的应用。如果需要,此演示能运行在一个独立的机器上,使用此机

5、器即是传输方也是接收方。用 JMF 的所有功能,你仍然需要至少两台联网的机器。要观察到在网络中使在 23 页中的 Resour可Java 2,完整的源代码文件,以及其他一些完成本指南所需要的工具。安装文件将 JMF 安装到你的计算机中的第一步是在 JMF 的主页中安装文件,它同样包括了 JMF 源代码和 API 文档的。23 页的Resour中有JMF 的。目 前,JMF 有 Windows, Solaris, Linux 等版本,以及可运行在任何装有虚拟机的计算机上一个纯 Java 版本。为了增加性能,你需要一个与你操作系统所适应的版本。任何在一个操作系 统 JMF 版本下书写和编译的代码都

6、可以方便的移植到另外的操作系统上。例如,如果你了一个 Solaris 版本的 JMF 并且编译了一个类,这些类就可以 在 Linux 上使用,不会有任何问题。作为选择,你可以选择纯 Java 版本,或者跨版本的 JMF。这些版本没有使用操作系统特有的库文件。如果没有合适的 JMF 版本适合的操作系统,那么跨版本就是一个不错的选择。安装 JMF完 JMF 安装程序后,双击安装程序的图标。大部分安装程序都会有个选项,安装本地库到系统目录中;例如,Windows 版本安装程序会有一个选项“Move DLLs to Windows/System directory.”。最好将此选项选中,因为它能确保这

7、些操作系统的库文件能正确的安装在安装的过程中,你还需要选择项目来更新系统的 CLASSPATH 和 PATH 变量。如果这些选项被关闭,那么在你编译和运行本指南的例程序的时候就需要在 classpath 中引入 JMF 的 jar 文件。关于作者Eric Olson 在 Retek Inc 工作的工程师。它在 Java上有四年的工作经验,并且在不同的基于 Java 的技术上富有经验,包括 JMF, Jini, Jiro, JSP, servlets, and EJBs。Eric 毕业于 St. Paul, MN 的 St. Thomas 大学,获得计算机科学的学位。他在 IBM 的 SanFr

8、ancisco 项目组工作,负责 WebSphere 商业组件。他同时再为 Imation Corp.工作,负责应用。现在,他正在开发零售行业的基于 web 的解决方案。再业余的时间,Eric 和 PaulMonday 在 Stereo Beacon 上合作一个分布式的点对点的基于 JMF 的器。联系Eric.第二节. 一个简单的音频浏览器在本节中,进行创建一个简单的音频器的第一个练习。本例将介绍Manager 类和 Player 接口,中两个都是建立大多数基于 JMF 应用的重要部分。本例的功能目标是在字符界面下本地的音频文件。学习此源代码,并了解每一行所做的任务。完成本节后,你将会有一个基

9、于 JMF 的可WAV, AU 等多种音频文件的演示程序。在本练习后的源代码分类种可查询文件 SimpleAudioPlayer.java。包括 MP3,引入必要的类SimpleAudioPlayer 类中包括了一些调用,在其前几行中需要引入所有必要的类:import import import import importjavax.media.*; java.io.File; java.io.IOException; .URL;.MalformedURLException;The javax.media 包是由 JMF 定义的多个包之一。javax.media 是一个包,包括了定义 Mana

10、ger 类和 Player 接口等。本节中,主要学习 Manager 类和Player 接口,其余的 javax.media 类放在后面的章节中。除了引入 javax.media外,以上的代码片断引入了一些创建器的输入的。Player 接口在下面的代码片断中,创建一个公共类 SimpleAudioPlayer 并举例定义一个Player 变量:public class SimpleAudioPlayer private Player audioPlayer = null;术 语 Player 听起来由点熟悉,因为它是建立在公用的音频或者器的基础上的。事实上,这个接口的例子就像是当作它们的真实的

11、副本。 Players揭示了一个实体上的法。例如,一个 JMF器(如音箱系统或者 VCR)涉及到功能上的方器可以开始和结束一个流。在 本节种,将使用 Player 的开始和结束功能。在一个文件上创建一个 Player使用 JMF 获得一个特定文件的 Player 实例非常简单。Manager 类在 JMF 中如同一个工厂制作许多的特殊接口类型,包括 Player 接口。因此,Manager 类的责任就是创建 Player 实例,如下例:public SimpleAudioPlayer(URL url) throws IOException, NoPlayerException,CannotRe

12、alizeException audioPlayer = Manager.createRealizedPlayer(url);public SimpleAudioPlayer(File file) throws IOException, NoPlayerException,CannotRealizeException this(file.toURL();如果你看完本节的代码,你可以注意到 Manager 类包含了创建一个 Player 实例的其他方法。会研究其中的一些,如在后面的章节中的 DataSource 或者MediaLocator 的实例化。Player 的状态JMF 定义了大量的一个

13、 Player 实例可能存在的不同状态。如下:Prefetched Prefetching Realized Realizing Started Unrealized使用这些状态因 为使用常常是资源非常密集的,由 JMF 对象揭示的许多方法都是不闭塞的,允许一系列事件的状态改变的异步通知。例如,一个 Player 在它可以启 动之前,必须经过 Prefetched 和 Realized 状态。由于这些状态的改变都需要一些时间来完成,JMF应用可以分配一个线程来初始化创建 Player 实例,然后再继续其他的操作。当 Player 准备就绪的时候,它会通知应用程序其状态已经改变。在一个如同的这样

14、简单的 程序中,多功能性的类型并不是很重要。处于这个原因,Manager 类也提供了一些创建 Realized player 的有用方法。调用一个createRealizedPlayer()方法来阻塞调用线程,直到player 达到Realized 状态。为了调 用一个无阻塞的创建 player 的方法,在 Manager 类中使用了一个createPlayer()方法。下面的一行代码中创建了一个的Realized player:audioPlayer = Manager.createRealizedPlayer(url);需要在例 程序中使用启动和停止 Player设定一个 Player 实

15、例的启动或是停止就如同调用 Player 的一个简单的认证方法,如下所示:public void play() audioPlayer.start();public void stop() audioPlayer.stop(); audioPlayer.close();调用 SimpleAudioPlayer 类中的 play()方法来实现调用 Player 实例的 start()方法。调用此方法后,你能听到本地的喇叭player 停止并且关闭掉 Player 对象。文件。同样的,stop()方法使对 于和或者本地文件来说,关闭 Player 实例所有资源是一个有用的方法。因为这是一个简单的例

16、子,关闭 Player 是终止一个会话可接受 的方法。但是在实际的应用中,你需要的确认在除掉 Player 之前必须要关闭掉。一但你已经关闭掉 player,在再次的 Player 实例(等待它的状态改变)。一个之前你必须要创建 一个新建立一个 SimpleAudioPlayer最后,这个应用程序要包含一个可以从命令提示行中输入命令而调用的main()方法。在此 main()方法中, File audioFile = new File(args0);调用创建 SimpleAudioPlayer 的方法:SimpleAudioPlaylayer = new SimpleAudioPlayer(a

17、udioFile);在音频文件之前的唯一的一些事情就是调用已经创建的音频 player 的方法play(),如下所示:playlay();要停止和清除掉音频 player,在 main()方法中也应该有如下调用: player.stop();编译和运行 SimpleAudioPlayer通过在命令提示行输入 javac SimpleAudioPlayer.java 来编译例程序。所创建的文件 SimpleAudioPlayer.class 在当前工作目录中。然后在命令提示行中键入如下命令来运行例程序:java SimpleAudioPlayer audioFile将 audioFile 替换成

18、你本地机器上的音频文件。所有的相对文件名都试相对于当前的工作目录。你会看到一些当前正在回车键。文件的标志信息。要终止,按下如果编译失败,确认 JMF 的 jar 文件已经正确的包含在 CLASSPATH 环境变量中。第三节. JMF 用户界面组件一节中,学习了建立一个通过字符界面音频文件的应用程序。JMF中一个最重要的特点就是你不需要为了配置器而去了解文件的格式;一 切都内置了。举一个例子,再前面的例子中,需要使用 MP3 格式的时候,不需要让应用程序为一个 MP3 文件建立一个特殊的 Player。如同你将会再本节所见到的,对于件类型接口的详细资料。文件的操作同样有效。JMF 有所有文处理与

19、音频最大的不同就是,须建立一个能的显示屏会建立一个的可视的幕。幸运的是,JMF 能处理许多的这些资料。如同再上例一样Player 对象,并且使用很多的可视组件来直接从 JMF 对象中创建浏览器。本节中,second ex学习两个例程序。his section, well walk through thele application. 请再后面的练习的源代码分布中查阅MediaPlayerFrame.java。关于例子 在 本节中,为练习的一部分创建一个能显示和运行本地音频和的应用程序。作研究 JMF 内置的一些GUI 组件。熟悉 AWT 和 Swing 将 有助于你理解本例,但这并不是必须的。

20、除非需要直接涉及到 JMF 的 GUI 组件,或者是不会详细介绍源代码的。你可以在源代码的注释中找到这里未涉及的详细说明。本例中使用的许多概念,类和方法都和第一个例子的类似。建立 Player 的基本操作大都一样。最大的不同就是需要对 Player 对象专研更深一点,特别当需要从 Player 获取信息的时候。如何开始器例子被设计得如同音频例子一样通过命令行来运行,但是本例需要建立在 GUI 基础上。如同在上节一样,先通过文件名调用应用。然后,应用程序显示一个带有可操作组件的窗体。在 MediaPlayerFrame 开始的一行中 javax.swing.Jframe 类。这就是使方法。任何客

21、户机程序创建了本 义的 show()方法来显示。下面是一个 MediaPlayerFrame 正在定义了类并扩展自,器如同一个在桌面上的单独窗体的对象后都可以通过调用 Jframe 类中定MPEG的屏幕截图:获取 GUI 组件Player 界面有一些方法来获取已选择可视组件的涉及。在 MediaPlayerFrame 中,使用如下组件:pplayer.ponent()是一个所有的可视组件。ponent() 是一个操作时间轴的可视组件(包括开始,停止,回放),也包含了一些 player.getGainControl()流的有用信息。ponent() 是操作音量(增加)的可视组件。getGainC

22、ontrol()方法返回一个 GainControl 实例,可用于改变的增加等级。使用可视化组件上面的界面方法都返回一个ponent 类的实例。没个实例都视可加载到窗体上的可视组件。这些组件都与 Player 有直接的联系,所以在这些组件上的所有可视元素的处理都会产生 Player后相应的变化。在这些组件加入到的窗体的之前,必须要保证它们不为空。因为并不是所有的器包括每一种可视组件只需添加相关器类型的组ponent()件。比 如,一般来说一个音频就要返回空。你不会想在音频器没有可视组件,所以器窗体上添加可视组件的。获得的特殊控制 个 Player 实例也可以通过 getControl()和 g

23、etControls()方法来其控制,getControls()返回一个控制对象集, 而 getControl()返回一个控制。不同的器类型可选择为特殊的操作来控制集去指定的类型,或者用于获取该的传输机制。如果你在写 一个只支持某些类型的器,你需要依靠某些在 Player 实例中可用 Control 对象。由于的器是非常抽象的,被设计于多种 不同类型,简单就可使用的为用户所有的 Control 对象。如果找到任何扩展的控制集,ponent()方法 来增加相应的可视控件到面板上。通过这个办法,用户就可以观察器上的所有组件。以下代码片断将所有的控制对象给用户:Control controls =

24、player.getControls();for (i = 0; i controls.length; i+) if (controlsiponent() != null) tabPane.add(controlsiponent();为 了使一个真实的应用程序能用 Control 实例做一些有用的事(除了能显示可视组件之外),应用程序需要知道该 Control 的特殊类型,并分配它。此 后,应用程序就可使用这些 control 来控制了。例如,如果你知道你经常使用的javax.media.control.QualityControl 类型的 Control,你能使用 QualityContro

25、l 界面,之后在 QualityControl 界面上通过调用各种方法来改变性质设定。使用一个 MediaLocator在新的基于 GUI 的器和的第一个简单器之间最大的不同就是,使用一个 MediaLocator 对象而不是 URL 来创建 Player 实例,如下所示:public void setMediaLocator(MediaLocator locator) throws IOException, NoPlayerException, CannotRealizeException setPlayer(Manager.createRealizedPlayer(locator);在稍后

26、的章节中这个变化的原因。目前,在网络上资源站点上,关于 MediaLocator 对象和 URL 的描述被认为是非常相似的。事实上,你可以 从一个 URL 创建一个 MediaLocator,也可以从 MediaLocator 获取到 URL。的新器一个 URL 中创建一个 MediaLocator,并使用该 MediaLocator 通过文件创建了一个 Player。编译和运行 MediaPlayerFrame通过在命令提示行输入 javac MediaPlayerFrame.java 来编译例程序。在工作目录下将创建一个名为 MediaPlayerFrame.class 的文件。在命令提示

27、行中键入如下来运行例程序:java MediaPlayerFrame mediaFile你需要用你本机上的一个文件来替换掉 mediaFile(音频或者文件都可以)。所有的相对文件名都是相对于当前工作目录。你会看见一个显示控制文件的 GUI 控制集的窗口。欲了解 JMF 支持的音频和资源。文件列表,在 23 页的如果初始编译时失败,请确认 JMF 的 jar 文件已经包含在当前的 CLASSPATH 环境变量中。MediaPlayerFrame 在行动在本节前你看见的一个 屏幕截图显示了一个音频器正在器正在MPEG文件的屏幕截图。下面的一个 MP3 文件:要的学习本练习中的例子,查看完成的 M

28、ediaPlayerFrame 源代码。第四节. JMF 概念JMF 体系结构你过了使用 JMF本地文件是容易,现在后退一步,来看看一幅是如何通过 JMF 创建了如此成基于的应用程序的大的画面,是如 何通过 JMF 创建了如此成基于的应用程序。全面的了解 JMF 体系结构是没有意义的,本节将给你一个大体的概念,关于高级的 JMF 组件是如何组合起 来创建想得到的东西。JMF 的组件结构非常的灵活,它的组件一般可以分成三个部分: Input 描述某种被用于在进程休息的时候作为一个输入的。 pros 执行某些输入上的活动。一个过程有一个明确的输入和输出。大量的过程可用, 能被用于一个输入或者一批输

29、入。这些过程能被联系起来,一个过程的输出被用于另外一个过程的输入。在这种风格中,大量的过程可能被应用于一个输入。(这段 期间是可选择的开始的两个例子没有包含真正的数据过程,只有一个来自文件的输入和一个通过 Player 的输出。) Output 描述了的某些目的地。从这些描述中,你可以想象到 JMF 组件体系结构听起来就好像在一个典型的声系统或者 VCR 之后。很容易设想到,使用 JMF 就如同打开电视或者在声音箱系统下调节声音的风格。例如,录制喜爱的电视件的基础中:的简单的动作能在这些组 Input 是电视广播流,在同一个频道音频和。 Pros 是一个设备(就是,一个 VCR 或者许多的数字

30、设备)转换模拟或者数字音频 Output 是广播流成适合到磁带或其他上的格式。已格式化轨迹(音频和)到某些类型的上。JMF 资料处理模式以下说明了JMF 数据处理模块并对每个类型给出了例子:使用此模式,很容易明白前面的两个例子,从文件中输入音频和并输出到本地计算机上。在后面的章节中,的 JMF 网络功能。也会谈论一些通过和接收音频处理模型例子将 JMF 的输入,处理和输出模式联系起来,作都可能通过 JMF 完成。一个例子,转换一种能开始想象许多基于的操类型为其他类型并将其输出存储到一个新 的文件。举一个例子,想要在不损坏原始文件的前提下转化一个 WAV 格式的音频文件为 MP3 格式。以下的过

31、程模式插图,就是转换的步骤:开始执行本例的输入是一个 WAV 文件。它被一个格式转换工具加工,并输出到一个新的文件。现在,让看看 JMF API 中的这个模式的每一步。使用输入,处理和输出模式作为概念上的路标。JMF 输入再 JMF 中,一般由一个 MediaLocator 对象来描述一个输入。如先前规定的,MediaLocator 的外观和行为都非常象一个 URL,这样它可以唯一确定网络上的一个资源。事实上,使用一个 URL 来创建一个 MediaLocator 是完全可能的;面的两个例子中就是这样做的。为 了的转换例子,需要建立一个 MediaLocator 来描述最初的 WAV文件。如同

32、在后面的章节中见到的,一个 MediaLocator 也可以用于描述一个网络中流。在这个案例中,MediaLocator 会描述的URL很像一个被 URL 指定的在 Web 上的资源,用于取代指定一个本地文件系统的文件来建立 MediaLocator。一个 MediaLocator 和一个 URL 之间的不同要 成功的建立一个 URL 对象,需要适当的 .URLStreamHandler 安装于系统中。这个流处理的用途是能够处理被 URL 描述的流类 型。一个 MediaLocator对象并没有这个需要。例如,的下个应用程序将使用实时传输协议(RTP)在网络上传输音频。由于多数的系统都未为 R

33、TP 协议安装一个 URLStreamHandler,所以创建一个 URL 对象会失败。在这个应用中,只有 MediaLocator 对象会成功。要理解关于 URL 对象以及创建和一个 URLStreamHandler 的信息,查阅JDK 帮助文档(查看 23 页资源)。JMF 处理机当使用 JMF 的时候,应用程序的处理机组件被 Prosor 接口实例描述。你需要已有些熟悉 Prosor,它扩展至 Player 接口。由于 Prosor 继承直sor 增加了Player 接口,它同样也从 Player 继承所有可用属性。另外,Pro两个属性:Configuring 和 Configured。

34、这些扩展的属性(和与之关联的方法)用于 Prosor 从输入流收集信息时的通信。在的最后的例程序中建立一个 Prosor 用于将 MP3 编码格式的音频转换成适合在网络上的格式。在稍后的板块中会创建一个简单的Prosor 的步骤。JMF 输出有 少许的方法用于描述 JMF 中处理模式的输出状态。最简单的(并且 最后一个例子中使用的)是 javax.media.DataSink 接口。一个 DataSink在内容并且将其传送到一些目的地。本节中最开始的音频格式转换过程中,MP3(输出)文件将被 DataSink 描述。在最后一 个例子中,使用一个DataSink 在实际上完成网络中音频的工作。一

35、个DataSink 是在Manager类中,由指定一个 DataSource(输入到 DataSink)和一个 MediaLocator(输出到 DataSink)完成的。一个 DataSource 实例描述可用于 Players,Prosors 和 DataSinks 的输入数据。一个处理机的输出也被描述成一个 DataSource 对象。这就是为什么处理器能彼此联系起来,在同一数据中完成多种操作。这也是来自 Prosor 的输出能作为输入被 Player 或者 DataSink 使用的原因(它可将传递到输出目的地)。一个 DataSink 的最后目的文件由一个 MediaLocator 对

36、象说明。如同前面一样,MediaLocator 描述一个网络资源;这就是流将被传递的地方。第五节.接收JMF 和实时传输协议(RTP)许 多的友善网络的特征直接建立在 JMF 中,这些使为客户端程序通过网络传输和接收非常容易。当在一个网络上的一个用户想要接收任何种类的流的时候, 它不需要在广播。在流前等待全部的广播到机器上;用户可以实时的中些提出了这个概念。通过流,一个网络客户端能接收广播。到其他机器上 广播的音频,甚至获取正在发生的实况在 IETF RFC 1889 中定义了实时传输协议(RTP)。发展在快速和可靠的状态下通过网络传输时间极其敏感的数据,RTP 在 JMF 中用于提供给用户向

37、其他网络节点中传输 流的方法。在 本节中,学习的最后一个例程序。这里,你将学习到如何传输一个在一台机器上的 MP3 文件到另外的在同一个网络的机器上去。实际的 MP3源文 件并不从主计算机上移除,它也不使到其他机器上去;事实上它将会转换成能使用 RTP 传输的文件格式并通过网络发送。一旦被一个客户端接收到,源文件 (现在是 RTP 信息包的形式)可以再次传输,这一次是在的一种格式。在 MediaTransmitter.java 文件中源代码查看学习以下练习。器上可设置处理模式可以面的章节中定义的处理模式的基础下来的最终的例子。在传输机器上,处理模式看起来像这样:事实上,MediaTransmi

38、tter 对象源代码包括了以下三行:private private privateMediaLocator mediaLocator = null; DataSink dataSink = null;Prosor mediaProsor = null;这三个实例变量可以直接到前面的处理模式图表,如下:的处理器;它将负责转换音频文件从 MP3 文件模 mediaProsor 变量是式到一个适合通过 RTP 协议传输的格式。 dataSink 变量是的输出块。 当建立 DataSink 时需要指定一个 MediaLocator,它是 DataSink 的目的文件。当通过运行 DataSink的处理

39、过的,它将传输到在MediaLocator 中指定的地点。RTP MediaLocator面的两个练习中,实例。 在本练习中, 出流;换句话说,通过从文件中获得的一个 URL 建立了 MediaLocator须建立一个 MediaLocator 来描述网络上输须创建一个能的音频的目的地的MediaLocator。一个 RTP MediaLocator 符合如下规则,看起来就像一个典型的URL:rtp:/address:port/content-type让看看上面 URL 规范的每一段: address 是将传输的的地址。以单播的模式传输(一个IP 地址),地址将会是有意接收的机器的 IP 地址

40、。以广播的模式(到子网中的所有机器),地址将会 是以 255 作为最后的一块的子网地址。举个例子,如果我再子网中可指定地址为 192.168.1 和想要到子网中的所有节点,我可以指定55 作为地址;这样允许子网中的每个节点 port 必须是被传输者和接收者都允许的一个端口。广播。 content-type 是下面的一个简单的 RTP流类型。在的案子中,这个将会是音频。MediaLocator 例子会让所有在指定网络中的机器接收到流:rtp:/55:49150/audio创建一个处理机在 setDataSource()方法中首先要做的就是创建一个 Prosor 实例。下面的 Prosor 的职责

41、是转换 MP3 音频为一个 RTP 来表示:public void setDataSource(DataSource ds) throws IOException,NoProsorException, CannotRealizeException, NoDataSinkException mediaProsor =Manager.createRealizedProsor(new ProsorM(ds, FORMATS, CONTENT_DESCRIPTOR);在 Manager 类中,能创建一个 Prosor 对象,通过两种方法中的一种:createProsor ()或者 createReal

42、izedProsor()。你很可能会注意到这两个方法样式的显示和前面例子中创建一个 Player 的方法很相似。在 目前的例子中,创建一个已实现的 Prosor。这样做是因为使用的应用非常简单,在 Proso 处于 Realized 状态时不需要关心任何真实的工作。创建一个 ProsorM创建一个已实现的 Prosor,需要创建一个为 Prosor 描述输入和输出,需要下面的类型的 Pro一些:sorM实例。为了创建ProsorM一个 DataSource,将被处理的(输入文件)。一个 javax.media.Format 数组,描述输入的格式。一个 tocol.ContentDescript

43、or 实例,为的处理机描述输出格式。传送者的 DataSource 是通过一个参数传递到此方法。定义输入和输出格式因 为的 MediaTransmitter 类会被时常用于将输入格式(MP3)转换成创建一 个新的一种输出格式(音频 RTP),中学对象被定义成静态。javax.media.format.AudioFormat 实例用于描述输入类型(在 java 帮助文档中查看可用格式)。这就是的处理 机可以获取 MP3 音频文件的原因。也创建一个 tocol.ContentDescriptor 实例来描述想要处理机输出的。在的案子中,这是一个 RTP流。这就是为什么的处理机可以只制造 RTP 流

44、。下面的代码片断显示了如何设置格式和内容描述符变量,用于创建ProsorM对象:ic final Format FORMATS = new Format private snew AudioFormat(AudioFormat.MPEG_RTP);private sic final ContentDescriptor CONTENT_DESCRIPTOR =new ContentDescriptor(ContentDescriptor.RAW_RTP);连接输入,处理机和输出现在有一个处于 Realized 状态的 Prosor,需要设置 DataSink 以能实际上RTP。创建 DataSi

45、nk 是简单的大概使用另外一个调用给 Manager对象,如下所示:dataSink = Manager.createDataSink(mediaPro mediaLocator);setDataOutput(),createDataSink ()方法获取新 Prosor 的输出(作为一个 DataSource 参数)和 MediaLocator 对象,和 MediaTransmitter 对象同时建立的。通过这样,你能开始的不同的组件是如何在处理模式中联系起来的:从一个Pro Prosor 中获取输出并使用他们作为输入到其他组 件。在这个特殊的应用中,sor 输出用于传输的 DataSink

46、 的一个输入。创建一个 DataSource 实例在这点上,全部都是做和设置的器的广播传输。需要创建 DataSource 对象,用于创建处理机(就是,在的MediaTransmitter 中,参数传递到 setDataSource()方法)。下面是创建一个 DataSource 实例的代码:File mediaFile = new File(args1);DataSourource = Manager.createDataSource(new MediaLocator(mediaFile.toURL();这 段代码是在 MediaTransmitter 对象中的 vmain()方法。这里通过

47、从命令行输入的第二个参数创建一个 File 对象。通过文件创建 一个MediaLocator,而后通过位置创建一个 DataSource。这个新近创建的 DataSource是一个涉及到传送者的输入文件。能使 用这个 DataSource 初始化传输者。开始和停止 MediaTransmitter通过调用其中的 startTransmitting()方法来开始 MediaTransmitter,如下所示:public void startTransmitting() throws IOException mediaProsor.start();dataSink.open(); dataSink

48、.start();这个方法首先开启处理机,然后打开并启动 DataSink。在这个调用后,器就可在传送者上。停止传输者是非常简单的。以下代码将 DataSink 和 Prosor 都停止和关闭掉:public void stopTransmitting() throws IOException dataSink.stop();dataSink.close();mediaPro mediaProsor.stop();sor.close();编译和运行 MediaTransmitter通过在命令行中输入 javac MediaTransmitter.java 来编译例程序,可在你的工作目录中生成一

49、个同名的.class 文件。要运行例程序,在命令提示行中输入以下代码:java MediaTransmitter rtpMediaLocator audioFile此例将创建一个 myAudio.mp3 文件的广播。记将 rtpMediaLocator替换成一个传输的 RTP URL,如同先前的。你同样也需要将 audioFile 替换成你本机的音频文件名。所有的相对文件名都是相对于当前工作目录的。你会看见一些信息标志正在的文件。按下 Enter 键来停止。为传送者的一个例命令行交互如下:java MediaTransmitter rtp:/55:49150/audio myAudio.mp3

50、如果初始编辑失败,确定 JMF 的 jar 文件包含 CLASSPATH 环境变量中。要近一步探索本程序和练习,请查阅 MediaTransmitter 源代码。接收传输的现在你可能会问,“如果没有人可以看或者收听的话,这个的?”好幸运的是,设定一个接收的客户端只需要对在第二个例程序的MediaPlayerFrame 源代码做很小的改动。 MediaPlayerFrame 类需要一个很小的调节来接收和法中,你需要注释掉如下的一行:音频文件。在 main()方mpf.setMediaLocator(new MediaLocator(new File(args0).toURL();并且输入如下的一

51、行:mpf.setMediaLocator(new MediaLocator(args0);这个简单的改动允许通过 String 来创建一个 MediaLocator 对象,而不是通过创建一个 File 来创建 MediaLocator。其他代码都一样。指定 RTP URL在 12 页的说明编译和运行 MediaPlayerFrame 介绍了如何编译和运行 MediaPlayerFrame 例程序。这唯一的不同就是你需要为传输者指定 RTP URL。为接收者的例命令行交互如下:java MediaPlayerFrame rtp:/55:49150/audio运行网络传送者的注意事项如果你在网络

52、上只使用一台机器,你仍然可以运行传输程序。当你启动传送程序的时候,你可以即使用 RTP URL 传输地址,也可指定你工作的机器的机器地址。为了能够调节传输,在开始前接收者必须使用精确的同样的 RTP URL。如果你运行本例真实的网络版本,每台你使用的机器都需要安装 JMF,不论是传输还是接收流。这是必须的,因为不论是传送程序还是接收程序都大量的使用了 JMF 的 API。在任一个案子中,确认在指定的 RTP URL 中使用了相同的地址和端口;否则传输是不会工作的。第六节. 约束和资源摘要我希望本指南能给你提供如何使用 JMF 的 API 的有用的浏览。建立了三个小的应用程序来本地的音频和,也通

53、过网络和接收。这些应用程序的源代码中包含了很多的 javadoc 样式的注释。这就有助于你理解你剩余许多 JMF 的。在本指南中并没有涉及。实际上,更关注 JMF 的基本概念和应用;在此基础上,能轻易地扩展学习的其他范围。要更深入 JMF 的应用程序,你可能想要学习下面的面板中所提到的题,查阅 23 页的资源。更近一步的阅读本指南中的主高级大量的值得做的练本指南的范围之上。在简单的说明之下自己更进一步的学习,你可以扩展的练习开始:的应用程序代码,也可以反展你的 JMF 相关知识。使用以下捕获:JMF 包含了丰富的 API 来捕获数据。如果你对使用 JMF 捕获感,你可以使用 javax.media.CaptureDeviceManager 类和tocol.CaptureDevice 接口的 API 来学习。对于一个高级的练习,考虑使用 CaptureDeviceManager 和 CaptureDevice 接口来增加捕获功能到应 用程序的 GUI 版本上。 会话管理:由于本指南是一个 JMF 的说明,仅实现了 javax.media.DataSink 输出。另 外的输出表示是使用 javax.media.rtp.Ses户端创建并监视他们的 RTP 流和连接。通过 Ses使输出表现非常的简单,仅Manager。这个

温馨提示

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

评论

0/150

提交评论