??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲无线一二三四区手机,亚洲狠狠成人综合网,亚洲精品免费网站http://m.tkk7.com/coffeecat/category/11688.htmlzh-cnFri, 02 Mar 2007 03:05:16 GMTFri, 02 Mar 2007 03:05:16 GMT60DW中的插g介绍与下?/title><link>http://m.tkk7.com/coffeecat/archive/2006/09/22/71316.html</link><dc:creator>KevinGong</dc:creator><author>KevinGong</author><pubDate>Fri, 22 Sep 2006 06:23:00 GMT</pubDate><guid>http://m.tkk7.com/coffeecat/archive/2006/09/22/71316.html</guid><wfw:comment>http://m.tkk7.com/coffeecat/comments/71316.html</wfw:comment><comments>http://m.tkk7.com/coffeecat/archive/2006/09/22/71316.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/coffeecat/comments/commentRss/71316.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/coffeecat/services/trackbacks/71316.html</trackback:ping><description><![CDATA[ <a >http://www.m-heaven.com/dreamweaver/</a> <img src ="http://m.tkk7.com/coffeecat/aggbug/71316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/coffeecat/" target="_blank">KevinGong</a> 2006-09-22 14:23 <a href="http://m.tkk7.com/coffeecat/archive/2006/09/22/71316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java构造自q媒体播放?/title><link>http://m.tkk7.com/coffeecat/archive/2006/07/27/60421.html</link><dc:creator>KevinGong</dc:creator><author>KevinGong</author><pubDate>Thu, 27 Jul 2006 13:00:00 GMT</pubDate><guid>http://m.tkk7.com/coffeecat/archive/2006/07/27/60421.html</guid><wfw:comment>http://m.tkk7.com/coffeecat/comments/60421.html</wfw:comment><comments>http://m.tkk7.com/coffeecat/archive/2006/07/27/60421.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/coffeecat/comments/commentRss/60421.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/coffeecat/services/trackbacks/60421.html</trackback:ping><description><![CDATA[ <a >http://www.21tx.com/dev/2004/02/14/19372_3.html</a> <img src ="http://m.tkk7.com/coffeecat/aggbug/60421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/coffeecat/" target="_blank">KevinGong</a> 2006-07-27 21:00 <a href="http://m.tkk7.com/coffeecat/archive/2006/07/27/60421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Media Framework Basics http://m.tkk7.com/coffeecat/archive/2006/07/27/60414.htmlKevinGongKevinGongThu, 27 Jul 2006 12:05:00 GMThttp://m.tkk7.com/coffeecat/archive/2006/07/27/60414.htmlhttp://m.tkk7.com/coffeecat/comments/60414.htmlhttp://m.tkk7.com/coffeecat/archive/2006/07/27/60414.html#Feedback1http://m.tkk7.com/coffeecat/comments/commentRss/60414.htmlhttp://m.tkk7.com/coffeecat/services/trackbacks/60414.html最q一个项目要用到JMFQ所以搜集了点资料,以供自己学习Q?br />内容表格
1. 关于此指?br />2. 一个简单的音频播放?br />3. JMF用户接口lg
4. JMF概念
5. 传播和接收媒?br />6. ȝ以及资源



W一? 关于此指?/span>

此指南包含的内容Q?br />
Java媒体架构(JMF)是一个o人激动的通用的APIQ它允许Java开发者用许多不同的方法处理媒体。本指南主要通过使用工作的例子提供一个JMF的一些主要的特征的概q。阅d本指南后Q你会明白JMF体系l构中的主要播放功能。你同样能正的使用JMFQ用现存的例子和可为更多特D功能扩展的源代码?br />
本指南包含着以下主题Q?br />· 下蝲和安装JMF
· 主要的JMFcM及它们在JMF体系l构中的应用
· 播放本地的媒体文?br />· 为媒体的存取和操作制作以和图形用L?GUI)
· 通过|络传播媒体
· 通过|络接收媒体

几乎所有的媒体cd的操作和处理都可以通过JMF来实现。全面的讨论JMF所提供的所有特征已l超q了本指南的范围Q我们将使用三个单的媒体应用E序来学习此框架的构建模块。通过q个ҎQ本指南ؓ你未来学习和实施更多Ҏ的应用提供准备?br />我应该用此指南吗?

本指南会带你学习使用JMF工作的基。ؓ完成q些Q我们会创徏三个的独立工作的例程序。每个例子都会徏立前一个例子的基础上,昄JMF功能性的不同斚w?br />在本指南中的例子假定你曾l用过q且已经熟悉了JavaE序语言。除了Java核心和JMF的类之外Q我们会使用一些Java AWT和Swingc?用于创徏GUI)Q也会有一些Java|络c?用于在网l中传输媒体)。对GUI和网l类一些熟悉有助于你更快的明白观点和这里的例子Q但q是阅L指南必须的?br />
我们学习的例程序如?/b>
· 一个简单的音频播放?JMF的HelloWorld应用)Q这个字W界面的播放器通过在命令行中简单的输入媒体文g的名字就可以播放大多数的音频cd。此音频播放器的演示大体上显CZJMF的特有的cR?br />· 一个图形界面的媒体播放器:我们用JMF内置的接口组件来建立囑Ş界面Q所以在此练习中必须有一些图形界面的~程l验。这个媒体阅览器演示使用了一些Java AWT和SwingcL为用hC图形组件?br />· 一个媒体广播应用:此应用程序允怸个本地媒体文仉过|络传播。此E序能灵zȝ使媒体只传输到指定的|络节点Q或者传输到一个子|络中的所有节炏V此演示使用了一些Java的网lAPIs来在|络中传输媒体?br />作ؓW三个练习的一部分Q我们将修改囑Ş界面的播攑֙Q让其能接收q且播放媒体?br />跌23观看ResourcesQ文章,指南Q和其他参考书目的列表Q这会帮助你学习到更到关于此指南包括的主题?br />
安装需?/b>
要运行此指南中的例程序,你需要如下的工具和组Ӟ
·  Java 2 q_Q标准版Q编译和q行演示E序
·  Java媒体框架Q版?.1.1a或者更?br />· 一块已l安装ƈ且配|号的适当的声?br />· 一台或者多台测试机?br />· 演示的源代码文g在mediaplayer.jar?br />最后的一个演C应用显CZJMF在网l中的应用。如果需要,此演Cq行在一个独立的机器上,使用此机器即是传输方也是接收斏V可是要观察到在|络中用JMF的所有功能,你仍焉要至两台联|的机器?br />?3中的Resources可下载Java 2q_Q完整的源代码文Ӟ以及其他一些完成本指南所需要的工具?br />
下蝲安装文g
JMF安装C的计机中的W一步是在JMF的主中下蝲安装文gQ它同样包括了JMF源代码和API文档的链接?3늚Resources中有下蝲JMF的链接?br />目前QJMF有Windows, Solaris, Linux{版本,以及可运行在M装有虚拟机的计算Z一个纯Java版本。ؓ了增加性能Q你需要下载一个与你操作系l所适应的版本。Q何在一个操作系lJMF版本下书写和~译的代码都可以方便的移植到另外的操作系l上。例如,如果你下载了一个Solaris版本的JMFq且~译了一个类Q这些类可以在Linux上用,不会有Q何问题?br />作ؓ选择Q你可以选择下蝲UJava版本Q或者跨q_版本的JMF。这些版本没有用操作系l特有的库文件。如果没有合适的JMF版本适合的操作系l,那么跨^台版本就是一个不错的选择?br />
安装JMF
下蝲完JMF安装E序后,双击安装E序的图标?br />大部分安装程序都会有个选项Q安装本地库到系l目录中Q例如,Windows版本安装E序会有一个选项“Move DLLs to Windows/System directory.”。最好将此选项选中Q因为它能确保这些操作系l的库文件能正确的安?br />在安装的q程中,你还需要选择目来更新系l的CLASSPATH和PATH变量。如果这些选项被关闭,那么在你~译和运行本指南的例E序的时候就需要在classpath中引入JMF的jar文g?br />
关于作?/b>
Eric Olson在Retek Inc工作的Y件工E师。它在Javaq_上有四年的工作经验,q且在不同的ZJava的技术上富有l验Q包括JMF, Jini, Jiro, JSP, servlets, and EJBs。Eric毕业于St. Paul, MN的St. Thomas大学Q获得计机U学的学位。他在IBM的SanFrancisco目l工作,负责WebSphere商业lg。他同时再ؓImation Corp.工作Q负责存储应用。现在,他正在开发零售行业的Zweb的Y件解x案。再业余的时_Eric和Paul
Monday在Stereo Beacon上合作—一个分布式的点对点的基于JMF的媒体播攑֙。联p?br />Eric zpalffy@yahoo.com.

W二? 一个简单的音频播放?/span>

在本节中Q我们将q行创徏一个简单的音频播放器的W一个练习。本例将介绍ManagercdPlayer接口Q中两个都是建立大多数基于JMF应用的重要部分?br />本例的功能目标是在字W界面下播放本地的音频文件。我们将学习此源代码Qƈ了解每一行所做的d。完成本节后Q你会有一个基于JMF的可播放包括MP3, WAV, AU{多U音频文件的演示E序?br />在本l习后的源代码分cȝ可查询文件SimpleAudioPlayer.java?br />
引入必要的类
SimpleAudioPlayercM包括了一些调用,在其前几行中需要引入所有必要的c:
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是一个核心包Q包括了定义ManagercdPlayer接口{。本节中Q我们主要学习ManagercdPlayer接口Q其余的javax.mediacL在后面的章节中?br />除了引入javax.media声明外,以上的代码片断引入了一些创建媒体播攑֙的输入的声明?br />
Player接口
在下面的代码片断中,创徏一个公qSimpleAudioPlayerqD例定义一个Player变量Q?br />

public class SimpleAudioPlayer {
private Player audioPlayer = null;


术语Player听v来由点熟悉,因ؓ它是建立在我们公用的音频或者视频播攑֙的基上的。事实上Q这个接口的例子像是当作它们的真实的副本。Players揭示了一个实体上的媒体播攑֙Q如立体音箱pȝ或者VCRQ涉及到功能上的Ҏ。例如,一个JMF媒体播放器可以开始和l束一个媒体流。在本节U,我们用Player的开始和l束功能?br />
在一个文件上创徏一个Player
使用JMF获得一个特定媒体文件的Player实例非常单。ManagercdJMF中如同一个工厂制作许多的Ҏ接口cdQ包括Player接口。因此,Managercȝ责Q是创徏Player实例Q如下例Q?br />

public SimpleAudioPlayer(URL url) throws IOException,
NoPlayerException,
CannotRealizeException {
audioPlayer = Manager.createRealizedPlayer(url);
}
public SimpleAudioPlayer(File file) throws IOException,
NoPlayerException,
CannotRealizeException {
this(file.toURL());
}



如果你看完本节的代码Q你可以注意到Managercd含了创徏一个Player实例的其他方法。我们会研究其中的一些,如在后面的章节中的DataSource或者MediaLocator的实例化?br />
Player的状?/b>
JMF定义了大量的一个Player实例可能存在的不同状态。如下:
· Prefetched
· Prefetching
· Realized
· Realizing
· Started
· Unrealized

使用q些状?/b>
因ؓ使用媒体常常是资源非常密集的Q由JMF对象揭示的许多方法都是不闭塞的,允许一pd事g监听的状态改变的异步通知。例如,一个Player在它可以启动之前Q必ȝqPrefetched和Realized状态。由于这些状态的改变都需要一些时间来完成QJMF媒体应用可以分配一个线E来初始化创建Player实例Q然后再l箋其他的操作。当Player准备qA的时候,它会通知应用E序其状态已l改变?br />
在一个如同我们的q样单的E序中,多功能性的cdq不是很重要。处于这个原因,ManagercM提供了一些创建Realized player的有用方法。调用一个createRealizedPlayer()Ҏ来阻塞调用线E,直到player辑ֈRealized状态。ؓ了调用一个无d的创建player的方法,我们在ManagercM使用了一个createPlayer()Ҏ。下面的一行代码中创徏了一个我们需要在例程序中使用?br />

Realized playerQ?br />audioPlayer = Manager.createRealizedPlayer(url);



启动和停止Player
讑֮一个Player实例的启动或是停止就如同调用Player的一个简单的认证ҎQ如下所C:

public void play() {
audioPlayer.start();
}
public void stop() {
audioPlayer.stop();
audioPlayer.close();
}


调用SimpleAudioPlayercM的play()Ҏ来实现调用Player实例的start()Ҏ。调用此Ҏ后,你能听到本地的喇叭的声音文g。同LQstop()Ҏ使player停止q且关闭掉Player对象?br />
对于d和或者播放本地媒体文件来_关闭Player实例释放所有资源是一个有用的Ҏ。因是一个简单的例子Q关闭Player是终止一个会话可接受的方法。但是在实际的应用中Q你需要小心的认在除掉Player之前必须要关闭掉。一但你已经关闭掉playerQ在再次播放一个媒体之前你必须要创Z个新的Player实例Q等待它的状态改变)?br />
建立一个SimpleAudioPlayer

最后,q个媒体播放应用E序要包含一个可以从命o提示行中输入命o而调用的main()Ҏ。在此main()Ҏ中,我们调用创建SimpleAudioPlayer的方法:

File audioFile = new File(args[0]);
SimpleAudioPlayer player = new SimpleAudioPlayer(audioFile);



在播N频文件之前的唯一的一些事情就是调用已l创建的音频player的方法play()Q如下所C:

player.play();



要停止和清除掉音频playerQ在main()Ҏ中也应该有如下调用:

player.stop();



~译和运行SimpleAudioPlayer
通过在命令提C输入javac SimpleAudioPlayer.java来编译例E序。所创徏的文件SimpleAudioPlayer.class在当前工作目录中?br />然后在命令提C中键入如下命令来q行例程序:

java SimpleAudioPlayer audioFile


audioFile替换成你本地机器上的音频文g。所有的相对文g名都试相对于当前的工作目录。你会看C些当前正在播放文件的标志信息。要l止播放Q按下回车键?br />如果~译p|Q确认JMF的jar文g已经正确的包含在CLASSPATH环境变量中?br />

W三? JMF用户界面lg
播放视频
在前一节中Q我们学习了建立一个通过字符界面播放音频文g的应用程序。JMF中一个最重要的特点就是你不需要ؓ了配|媒体播攑֙而去了解媒体文g的格式;一切都内置了。D一个例子,再我们前面的例子中,需要用MP3格式的时候,我们不需要让应用E序Z个MP3文g建立一个特D的Player?br />如同你将会再本节所见到的,对于视频文g的操作同h效。JMF有所有媒体文件类型接口的详细资料?br />处理视频媒体与音频最大的不同是Q我们必d立一个能播放视频的显C屏q。幸q的是,JMF能处理许多的q些资料。如同再上例一h们会建立一个Player对象Qƈ且用很多的可视lg来直接从JMF对象中创建我们的可视的媒体浏览器?br />本节中,我们学习两个例E序。In this section, we'll walk through the second example application. 请再后面的练习的源代码分布中查阅MediaPlayerFrame.java?br />
关于例子
在本节中Q我们将创徏一个能昄和运行本地音频和视频媒体的应用程序。作为练习的一部分Q我们将研究JMF内置的一些GUIlg。熟悉AWT和Swing有助于你理解本例,但这q不是必ȝ。除非需要直接涉及到JMF的GUIlgQ或者我们是不会详细介绍源代码的。你可以在源代码的注释中扑ֈq里未涉及的详细说明?br />本例中我们用的许多概念Q类和方法都和第一个例子的cM。徏立Player的基本操作大都一栗最大的不同是我们需要对Player对象专研更深一点,特别当需要从Player获取媒体信息的时候?br />
如何开?/b>
视频播放器例子被设计得如同音频播放例子一样通过命o行来q行Q但是本例需要徏立在GUI基础上。如同在上节一P我们先通过媒体文g名调用应用。然后,应用E序昄一个带有可操作媒体lg的窗体?br />在MediaPlayerFrame开始的一行中我们定义了类q扩展自Qjavax.swing.JframecR这是使媒体播攑֙如同一个在桌面上的单独H体的方法。Q何客hE序创徏了本媒体播放对象后都可以通过调用JframecM定义的show()Ҏ来显C?br />下面是一个MediaPlayerFrame正在播放MPEG电媄的屏q截图:

获取GUIlg
Player界面有一些方法来获取已选择可视lg的涉及。在MediaPlayerFrame中,我们使用如下lgQ?br />· player.getVisualComponent()是一个播放所有视频媒体的可视lg?br />· player.getControlPanelComponent() 是一个操作时间u的可视组Ӟ包括开始,停止Q回放)Q也包含了一些媒体流的有用信息?br />· player.getGainControl().getControlComponent() 是操作音量(增加Q的可视lg。getGainControl()Ҏq回一个GainControl实例Q可用于改变节目的增加等U?br />
使用可视化组?/b>
上面的界面方法都q回一个java.awt.Componentcȝ实例。没个实例都视可加蝲到我们窗体上的可视组件。这些组仉与Player有直接的联系Q所以在q些lg上的所有可视元素的处理都会产生Player播放媒体后相应的变化?br />在我们将q些lg加入到我们的H体的之前,必须要保证它们不为空。因为ƈ不是所有的媒体播放器包括每一U可视组Ӟ我们只需d相关播放器类型的lg。比如,一般来说一个音频播攑֙没有可视lgQ所以getVisualComponent()pq回I。你不会惛_音频播放器窗体上d可视lg的?br />
获得媒体的特D控?/b>
一个Player实例也可以通过getControl()和getControls()Ҏ来暴露其控制QgetControls()q回一个控制对象集Q而getControl()q回一个控制。不同的播放器类型可选择为特D的操作来暴露控刉L定的媒体cdQ或者用于获取该媒体的传输机制。如果你在写一个只支持某些媒体cd的播攑֙Q你需要依靠某些在Player实例中可用Control对象?br />׃我们的播攑֙是非常抽象的Q被设计于播攑֤U不同媒体类型,我们单的为用h露所有的Control对象。如果找CQ何扩展的控制集,我们可使用getControlComponent()Ҏ来增加相应的可视控g到标{N板上。通过q个办法Q用户就可以观察播放器上的所有组件。以下代码片断将所有的控制对象暴露l用P

Control[] controls = player.getControls();
for (int i = 0; i < controls.length; i++) {
if (controls[i].getControlComponent() != null) {
tabPane.add(controls[i].getControlComponent());
}
}


Z使一个真实的应用E序能用Control实例做一些有用的事(除了能显C可视组件之外)Q应用程序需要知道该Control的特D类型,q分配它。此后,应用E序可使用q些control来控制媒体节目了。例如,如果你知道你l常使用的媒体暴露javax.media.control.QualityControlcd的ControlQ你能用QualityControl界面Q之后在QualityControl界面上通过调用各种Ҏ来改变性质讑֮?br />
使用一个MediaLocator
在我们新的基于GUI的媒体播攑֙和我们的W一个简单播攑֙之间最大的不同是Q我们用一个MediaLocator对象而不是URL来创建Player实例Q如下所C:

public void setMediaLocator(MediaLocator locator) throws IOException,
NoPlayerException, CannotRealizeException {
setPlayer(Manager.createRealizedPlayer(locator));
}


我们在E后的章节中讨论q个变化的原因。目前,在网l上资源站点上,关于MediaLocator对象和URL的描q被认ؓ是非常相似的。事实上Q你可以从一个URL创徏一个MediaLocatorQ也可以从MediaLocator获取到URL。我们的新媒体播攑֙一个URL中创Z个MediaLocatorQƈ使用该MediaLocator通过文g创徏了一个Player?br />
~译和运行MediaPlayerFrame
通过在命令提C输入javac MediaPlayerFrame.java来编译例E序。在工作目录下将创徏一个名为MediaPlayerFrame.class的文件?br />在命令提C中键入如下来q行例程序:

java MediaPlayerFrame mediaFile


你需要用你本Z的一个媒体文件来替换掉mediaFileQ音频或者视频文仉可以Q。所有的相对文g名都是相对于当前工作目录。你会看见一个显C控制媒体文件的GUI控制集的H口。欲了解JMF支持的音频和视频文g列表Q在23늚资源?br />如果初始~译时失败,L认JMF的jar文g已经包含在当前的CLASSPATH环境变量中?br />
MediaPlayerFrame在行?/b>
在本节前你看见的一个视频播攑֙正在播放MPEG视频文g的屏q截图。下面的屏幕截图昄了一个音频播攑֙正在播放一个MP3文gQ?br />要更多的学习本练习中的例子,查看完成的MediaPlayerFrame源代码?br />
W四? JMF概念
JMF体系l构
你曾见过了用JMF播放本地媒体文g是多么的ҎQ现在我们将后退一步,来看看一q是如何通过JMF创徏了如此成熟的Z媒体的应用程序的大的画面Q是如何通过JMF创徏了如此成熟的Z媒体的应用程序。全面的了解JMF体系l构是没有意义的Q本节将l你一个大体的概念Q关于高U的JMFlg是如何组合v来创建想得到的东ѝ?br />JMF的组件结构非常的灉|Q它的组件一般可以分成三个部分:
· Input描述某种被用于在q程休息的时候作Z个输入的媒体?br />· process执行某些输入上的zd。一个过E有一个明的输入和输出。大量的q程可用, 能被用于一个输入或者一批输入。这些过E能被联pv来,一个过E的输出被用于另外一个过E的输入。在q种风格中,大量的过E可能被应用于一个输入。(q段期间是可选择的——我们开始的两个例子没有包含真正的数据过E,只有一个来自文件的输入和一个通过Player的输出。)
· Output 描述了媒体的某些目的地?br />
从这些描qCQ你可以惌到JMFlg体系l构听v来就好像在一个典型的立体声系l或者VCR之后。很Ҏ设想刎ͼ使用JMF如同打开电视或者在立体声音ql下调节声音的风根{例如,录制喜爱的电视节目的单的动作能在q些lg的基中:
· Input 是电视广播流Q在同一个频道运输音频和视频?br />· Process 是一个记录设备(是Q一个VCR或者许多的数字讑֤Q{换模拟或者数字音频视频广播流成适合复制到磁带或其他媒体上的格式?br />· Output 是记录已格式化轨q(音频和视频)到某些类型的媒体上?br />
JMF资料处理模式
以下囄说明了JMF数据处理模块q对每个cdl出了例子:
使用此模式,很容易明白我们前面的两个例子Q从文g中输入音频和视频q输出到本地计算Z。在后面的章节中Q我们也会谈Z些通过传播和接攉频媒体的JMF|络功能?br />
处理模型例子
JMF的输入,处理和输出模式联pv来,我们能开始想象许多基于媒体的操作都可能通过JMF完成。一个例子,转换一U媒体类型ؓ其他cdq将其输出存储到一个新的文件。D一个例子,我们惌在不损坏原始文g的前提下转化一个WAV格式的音频文件ؓMP3格式。以下的q程模式插图Q就是我们将开始执行{换的步骤Q?br />本例的输入是一个WAV文g。它被一个媒体格式{换工具加工,q输出到一个新的文件。现在,让我们看看JMF API中的q个模式的每一步。我们用输入,处理和输出模式作为概念上的\标?br />
JMF输入
再JMF中,一般由一个MediaLocator对象来描qC个输入。如先前规定的,
MediaLocator的外观和行ؓ都非常象一个URLQ这样它可以唯一定|络上的一个资源。事实上Q用一个URL来创Z个MediaLocator是完全可能的Q我们在前面的两个例子中是q样做的?br />Z我们的媒体{换例子,我们需要徏立一个MediaLocator来描q最初的WAV文g。如同我们将在后面的章节中见到的Q一个MediaLocator也可以用于描qC个跨网l中媒体。在q个案例中,MediaLocator会描qC播的URL――很像一个被URL指定的在Web上的资源Q用于取代指定一个本地文件系l的文g来徏立MediaLocator?br />
一个MediaLocator和一个URL之间的不?/b>
要成功的建立一个URL对象Q需要适当的java.net.URLStreamHandler安装于系l中。这个流处理的用途是能够处理被URL描述的流cd。一个MediaLocator对象q没有这个需要。例如,我们的下个应用程序将使用实时传输协议QRTPQ在|络上传输音频。由于多数的pȝ都未为RTP协议安装一个URLStreamHandlerQ所以创Z个URL对象会失败。在q个应用中,只有MediaLocator对象会成功?br />要理解更多关于URL对象以及创徏和注册一个URLStreamHandler的信息,查阅JDK帮助文档Q查?3资源)?br />
JMF处理?/b>
当我们用JMF的时候,应用E序的处理机lg被Processor接口实例描述。你需要已有些熟悉ProcessorQ它扩展至Player接口。由于Processorl承直Player接口Q它同样也从Playerl承所有可用属性。另外,Processor增加了两个属性:Configuring和Configured。这些扩展的属性(和与之关联的ҎQ用于Processor从输入流攉信息时的通信?br />在我们的最后的例程序中Q我们将建立一个Processor用于MP3~码格式的音频{换成适合在网l上传播的格式。在E后的板块中我们会讨论创Z个简单的Processor的步骤?br />
JMF输出
有少许的Ҏ用于描述JMF中处理模式的输出状态。最单的Qƈ且我们将在最后一个例子中使用的)是javax.media.DataSink接口。一个DataSinkd媒体内容q且其传送到一些目的地。本节中最开始的音频格式转换q程中,MP3Q输出)文g被DataSink描述。在我们最后一个例子中Q我们将使用一个DataSink在实际上完成|络中传播音频媒体的工作。一个DataSink是在ManagercMQ由指定一个DataSourceQ输入到DataSinkQ和一个MediaLocatorQ输出到DataSinkQ完成的?br />一个DataSource实例描述可用于PlayersQProcessors和DataSinks的输入数据。一个处理机的输Z被描q成一个DataSource对象?br />q就是ؓ什么处理器能彼此联pv来,在同一媒体数据中完成多U操作。这也是来自Processor的输作ؓ输入被Player或者DataSink使用的原因(它可媒体传递到输出目的圎ͼ?br />一个DataSink的最后目的文件由一个MediaLocator对象说明。如同前面一PMediaLocator描述一个网l资源;q就是媒体流被传递的地方?br />
W五?传播接收媒体
JMF和实时传输协?RTP)
许多的友善网l的特征直接建立在JMF中,q些使ؓ客户端程序通过|络传输和接收媒体非常容易。当在一个网l上的一个用h要接收Q何种cȝ媒体的时候,它不需要在观看媒体前等待全部的q播下蝲到机器上Q用户可以实时的观看q播。在媒体中些提Zq个概念。通过媒体,一个网l客L能接收到其他机器上广播的音频Q甚臌取正在发生的实况视频q播?br />在IETF RFC 1889中定义了实时传输协议QRTPQ。发展在快速和可靠的状态下通过|络传输旉极其敏感的数据,RTP在JMF中用于提供给用户向其他网l节点中传输媒体的Ҏ?br />在本节中Q我们将学习我们的最后一个例E序。这里,你将学习到如何传输一个存储在一台机器上的MP3文g到另外的在同一个网l的机器上去。实际的MP3源文件ƈ不从主计机上移除,它也不复制到其他机器上去;事实上它会转换成能使用RTP传输的文件格式ƈ通过|络发送。一旦被一个客L接收刎ͼ源文Ӟ现在是RTP信息包的形式Q可以再ơ传输,q一ơ是在接收机器上可播攄一U格式?br />在MediaTransmitter.java文g中源代码查看学习以下l习?br />
讄处理模式
我们可以在前面的章节中定义的处理模式的基下来讨论我们的最l的例子。在传输机器上,处理模式看v来像q样Q?br />事实上,MediaTransmitter对象源代码包括了以下三行Q?br />

private MediaLocator mediaLocator = null;
private DataSink dataSink = null;
private Processor mediaProcessor = null;



q三个实例变量可以直接映到前面的处理模式图表,如下Q?br />·  mediaProcessor变量是我们的处理器;它将负责转换音频文g从MP3文g模式C个适合通过RTP协议传输的格式?br />·  dataSink变量是我们的输出块?br />· 当我们徏立DataSink时我们需要指定一个MediaLocatorQ它是DataSink的目的文件?br />
当我们通过q行DataSink我们的处理过的媒体,它将传输到我们在MediaLocator中指定的地点?br />
RTP MediaLocator
在前面的两个l习中,我们通过从文件中获得的一个URL建立了MediaLocator实例?在本l习中,我们必须建立一个MediaLocator来描q网l上媒体传播输出;换句话说Q我们必dZ个能我们的音频传播的目的地的MediaLocator。一个RTP MediaLocatorW合如下规则Q看h像一个典型的URLQ?br />

rtp://address:port/content-type



让我们看看上面URL规范的每一D:
· address 是将传输的媒体的地址。以单播的模式传输(一个专用IP地址Q,地址会是有意接收的机器的IP地址。以q播的模式传播(到子|中的所有机器)Q地址会是以255作ؓ最后的一块的子网地址。D个例子,如果我再子网中可指定地址?92.168.1和想要传播到子网中的所有节点,我可以指?92.168.1.255作ؓ地址Q这样允许子|中的每个节点监听广播媒体?br />· port 必须是被传输者和接收者都允许的一个端口?br />· content-type 是媒体流cd。在我们的案子中Q这个将会是音频?br />下面的一个简单的RTP传播MediaLocator例子会让所有在指定|络中的机器接收到媒体流Q?br />

rtp://192.168.1.255:49150/audio



创徏一个处理机
在setDataSource()Ҏ中我们首先要做的是创徏一个Processor实例?br />下面的Processor的职责是转换MP3音频媒体Z个RTP来表C:
public void setDataSource(DataSource ds) throws IOException,
NoProcessorException, CannotRealizeException, NoDataSinkException {
mediaProcessor = Manager.createRealizedProcessor(
new ProcessorModel(ds, FORMATS, CONTENT_DESCRIPTOR));
在ManagercMQ我们能创徏一个Processor对象Q通过两种Ҏ中的一U:
createProcessor()或者createRealizedProcessor()。你很可能会注意到这两个Ҏ样式的显C和前面例子中创Z个Player的方法很怼。在目前的例子中Q我们将创徏一个已实现的Processor。我们这样做是因为我们用的应用非常单,在Processo处于Realized状态时我们不需要关心Q何真实的工作?br />
创徏一个ProcessorModel
创徏一个已实现的ProcessorQ我们需要创Z个ؓProcessor描述输入和输出媒体类型的ProcessorModel实例。ؓ了创建ProcessorModelQ我们需要下面的一些:
· 一个DataSourceQ将被处理的媒体Q输入文Ӟ?br />· 一个javax.media.Format数组Q描q输入媒体的格式?br />· 一个javax.media.protocol.ContentDescriptor实例Qؓ我们的处理机描述输出格式。传送者的DataSource是通过一个参C递到此方法?br />
定义输入和输出格?/b>
因ؓ我们的MediaTransmittercM被时常用于将输入媒体格式QMP3Q{换成一U输出格式(音频RTPQ,中学对象被定义成静态。我们创Z个新的javax.media.format.AudioFormat实例用于描述媒体输入cdQ在java帮助文档中查看可用格式)。这是我们的处理机可以获取MP3音频文g的原因?br />我们也创Z个javax.media.protocol.ContentDescriptor实例来描q想要处理机输出的。在我们的案子中Q这是一个RTP媒体?br />
q就是ؓ什么我们的处理机可以只刉RTP?br />下面的代码片断显CZ我们如何讄格式和内Ҏq符变量Q用于创建ProcessorModel对象Q?br />

private static final Format[] FORMATS = new Format[] {
new AudioFormat(AudioFormat.MPEG_RTP)};
private static final ContentDescriptor CONTENT_DESCRIPTOR =
new ContentDescriptor(ContentDescriptor.RAW_RTP);



q接输入Q处理机和输?/b>
现在我们有一个处于Realized状态的ProcessorQ我们需要设|DataSink以能实际上传播RTP媒体。创建DataSink是简单的大概使用另外一个调用给Manager对象Q如下所C:

dataSink = Manager.createDataSink(mediaProcessor.getDataOutput(),
mediaLocator);



createDataSink()Ҏ获取新Processor的输出(作ؓ一个DataSource参数Q和MediaLocator对象Q我们和MediaTransmitter对象同时建立的。通过q样Q你能开始我们的不同的组件是如何在处理模式中联系h的:我们从一个Processor中获取输出ƈ使用他们作ؓ输入到其他组件。在q个Ҏ的应用中QProcessor输出用于传输媒体的DataSink的一个输入?br />
创徏一个DataSource实例
在这点上Q我们全部都是做和设|我们的媒体播放器的q播传输?br />我们需要创建DataSource对象Q我们用于创建处理机Q就是,在我们的MediaTransmitter中,参数传递到setDataSource()ҎQ。下面是创徏一个DataSource实例的代码:

File mediaFile = new File(args[1]);
DataSource source = Manager.createDataSource(new MediaLocator(
mediaFile.toURL()));



q段代码是在MediaTransmitter对象中的vmain()Ҏ。这里我们通过从命令行输入的第二个参数创徏一个File对象。我们通过文g创徏一个MediaLocatorQ而后通过位置创徏一个DataSource。这个新q创建的DataSource是一个涉及到传送者的输入文g。我们能使用q个DataSource初始化传输者?br />
开始和停止MediaTransmitter
我们通过调用其中的startTransmitting()Ҏ来开始MediaTransmitterQ如下所C:

public void startTransmitting() throws IOException {
mediaProcessor.start();
dataSink.open();
dataSink.start();
}



q个Ҏ首先开启处理机Q然后打开q启动DataSink。在q个调用后,接收机器可在媒体传送者上监听?br />停止传输者是非常单的。以下代码将DataSink和Processor都停止和关闭掉:

public void stopTransmitting() throws IOException {
dataSink.stop();
dataSink.close();
mediaProcessor.stop();
mediaProcessor.close();
}



~译和运行MediaTransmitter
通过在命令行中输入javac MediaTransmitter.java来编译例E序Q可在你的工作目录中生成一个同名的.class文g?br />要运行例E序Q在命o提示行中输入以下代码Q?br />

java MediaTransmitter rtpMediaLocator audioFile



此例创Z个myAudio.mp3文g的媒体广播。不要忘记将rtpMediaLocator替换成一个媒体传输的RTP URLQ如同先前讨论的?br />你同样也需要将audioFile替换成你本机的音频文件名?br />所有的相对文g名都是相对于当前工作目录的。你会看见一些信息标志正在播攄文g。按下Enter键来停止播放?br />
Z送者的一个例命o行交互如下:
java MediaTransmitter rtp://192.168.1.255:49150/audio myAudio.mp3
如果初始~辑p|Q确定JMF的jar文g包含CLASSPATH环境变量中。要q一步探索本E序和练习,h阅MediaTransmitter源代码?br />
接收传输的媒?/b>
现在你可能会问,“如果没有h可以看或者收听的话,q个传播媒体有什么好的??br />q运的是Q设定一个接收传播媒体的客户端只需要对我们在第二个例程序的MediaPlayerFrame源代码做很小的改动?br />MediaPlayerFramec需要一个很的调节来接收和播放音频文g。在main()Ҏ中,你需要注释掉如下的一行:

mpf.setMediaLocator(new MediaLocator(new File(args[0]).toURL()));


q且输入如下的一?

mpf.setMediaLocator(new MediaLocator(args[0]));


q个单的改动允许我们通过String来创Z个MediaLocator对象Q而不是通过创徏一个File来创建MediaLocator?br />其他代码都一栗?br />
指定RTP URL
?2늚说明~译和运行MediaPlayerFrame介绍了如何编译和q行MediaPlayerFrame例程序。这唯一的不同就是你需要ؓ传输者指定RTP URL。ؓ接收者的例命令行交互如下Q?br />

java MediaPlayerFrame rtp://192.168.1.255:49150/audio



q行|络媒体传送者的注意事项
如果你在|络上只有权使用一台机器,你仍然可以运行传输程序。当你启动传送程序的时候,你可以即使用RTP URL传输地址Q也可指定你工作的机器的机器地址。ؓ了能够调节传输,在开始前接收者必M用精的同样的RTP URL?br />如果你运行本例真实的|络版本Q每C使用的机器都需要安装JMFQ不论是传输q是接收媒体。这是必ȝQ因Z论是传送程序还是接收程序都大量的用了JMF的API?br />在Q一个案子中Q确认在指定的RTP URL中用了相同的地址和端口;否则媒体传输是不会工作的?br />
W六? U束和资?/span>
摘要
我希望本指南能给你提供如何用JMF的API的有用的览?br />我们建立了三个小的应用程序来播放本地的音频和视频Q也通过|络传播和接收媒体。这些应用程序的源代码中包含了很多的javadoc样式的注释。这有助于你理解你剩余的问题?br />许多JMF的主题在本指南中q没有涉及。实际上Q我们更xJMF的基本概念和应用Q在此基上,我们能轻易地扩展学习的其他范围。要更深入JMF的应用程序,你可能想要学习下面的面板中所提到的主题。更q一步的阅读本指南中的主题,查阅23늚资源?br />
高主题
大量的值得做的l习在本指南的范围之上。在单的说明之下自己更进一步的学习Q你可以扩展我们的应用程序代码,也可以反展你的JMF相关知识。用以下的l习开始:
· 媒体捕获QJMF包含了丰富的API来捕获媒体数据。如果你对用JMF捕获媒体感兴,你可以用javax.media.CaptureDeviceManagercdjavax.media.protocol.CaptureDevice接口的API来学习。对于一个高U的l习Q考虑使用CaptureDeviceManager和CaptureDevice接口来增加媒体捕获功能到媒体播放应用E序的GUI版本上?br />· 会话理Q由于本指南是一个JMF的说明,我们使输现非常的单,仅仅实现了javax.media.DataSink输出?br />另外的输C是使用javax.media.rtp.SessionManager。这个管理类允许客户端创建ƈ监视他们的RTP和q接。通过SessionManagerq后创建流Q它可能非常的接q监视RTP会话。作Z个高U的l习Q{换我们的C个演C程序来使用SessionManagerQ然后监听流出的RTP已l哪些客L在收听?br />· 使用JMF的多点传送:我们的广播演C应用程序说明了如何传送一个网l的媒体到另外一个网l的一或多台机器上厅R它也可能用JMF中的多点传输协议来提供给更复杂,多用L|络?br />JMF用户指南提供了一个用JMF的多播协议的更深入的探讨。更q一步追t本主题查看23资源?br />· 传输视频Q?我们的最后一个演C应用程序着g如何传输一个MP3音频文gQ但是JMF也能够通过|络传递视频。关注API文档中的Format和ContentDescriptorc获得如何用的更好的方法?br />· 导入/导出RTP媒体: JMF同样允许RTP保存ؓ文g以便来使用。D一个实例,一个远E电信会议可以保存下来以后再看?br />׃已l保存再RTP格式中,已经不需要再ơ{换,q样可导致传输程序的性能改进。通过一个文件而不是URL来设|DataSink对象中输?输出MediaLocator。你会再JMF用户指南中发现更深层ơ的主题探讨?br />
资源
JMF
· 下蝲mediaplayer.jarQ本指南中用的完整的例源代码?br />·  JMF主页 (http://www.javasoft.com/jmf)是最好的探讨JMF更多信息的资源?br />· 你可以找到JMF说明?http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html)Q再Java开发者联盟上包括API文档和JMF用户指南。你必须有权使用所有的q些资源Q如果你惛_M更深入的JMF~程的话?br />· 官方的JMF支持文g格式 面
(http://java.sun.com/products/java-media/jmf/2.1.1/formats.html) 列出了所有可为JMF辨识q播攄文g格式。此文g格式面也包括了学习更多关于捕获讑֤和RTP格式的参考?br />· MPEG-4 Video for JMF (http://www.alphaworks.ibm.com/tech/mpeg-4), 来自IBM
alphaWorks, 是一个JMF的视频编解码器?br />RTP
·  IETF RTP RFC (http://www.ietf.org/rfc/rfc1889.txt) 非常详细的描qCRTP协议?br />· 查看 JMF API Guide
(http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html) Q有许多有关于RTP协议和描qC及它是如何在JMF上应用的?br />· 哥u比亚大学有一个比较有用的RTP FAQ(http://www.cs.columbia.edu/~hgs/rtp/faq.html).
Java技?br />·  Java 2 Platform, Standard Edition (http://java.sun.com/j2se/) 可从sun公司获得?br />· sun的指南关于JFC/Swing (http://java.sun.com/docs/books/tutorial/uiswing/index.html)
?AWT (http://java.sun.com/docs/books/tutorial/information/download.html#OLDui) 是非常好的能学习到很多关于JavaE序语言中GUI~程的好地方?br />· 另外一个sun指南学习network programming 基础
(http://java.sun.com/docs/books/tutorial/networking/index.html)?br />多点传输协议
· Explicit Multicast (XCAST)
(http://oss.software.ibm.com/developerworks/opensource/xcast/) 是IP多点传输的一UŞ式,为非常多的多点传输组设计提供可升U的支持Q这些组有些量的参与者代表。XCAST 代码得到了IBM Common Public License的认可?br />· Todd Montgomery ?MTP page (http://www.nard.net/~tmont/rm-links.html),
在这里你能找C个广泛的涉及到多点传输协议的列表?br />附加资源
· 你可以在
developerWorks Java technology zone (http://www-106.ibm.com/developerworks/java/)中找到许多的关于Java各方面的内容?br />· 查看 developerWorks tutorials page
(http://www-105.ibm.com/developerworks/education.nsf/dw/java-onlinecourse-bytitle?OpenDocument&Count=for a complete listing of free tutorials.



KevinGong 2006-07-27 20:05 发表评论
]]>
一个JS针对表格行上下移动得ҎQ?/title><link>http://m.tkk7.com/coffeecat/archive/2006/07/26/60249.html</link><dc:creator>KevinGong</dc:creator><author>KevinGong</author><pubDate>Wed, 26 Jul 2006 13:01:00 GMT</pubDate><guid>http://m.tkk7.com/coffeecat/archive/2006/07/26/60249.html</guid><wfw:comment>http://m.tkk7.com/coffeecat/comments/60249.html</wfw:comment><comments>http://m.tkk7.com/coffeecat/archive/2006/07/26/60249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/coffeecat/comments/commentRss/60249.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/coffeecat/services/trackbacks/60249.html</trackback:ping><description><![CDATA[     摘要: 今天pȝ需求需要,用JS写了个代码,希望有需要得朋友可以看看Q?  1 <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" &...  <a href='http://m.tkk7.com/coffeecat/archive/2006/07/26/60249.html'>阅读全文</a><img src ="http://m.tkk7.com/coffeecat/aggbug/60249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/coffeecat/" target="_blank">KevinGong</a> 2006-07-26 21:01 <a href="http://m.tkk7.com/coffeecat/archive/2006/07/26/60249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些用得Chm格式得帮助文?/title><link>http://m.tkk7.com/coffeecat/archive/2006/07/26/60247.html</link><dc:creator>KevinGong</dc:creator><author>KevinGong</author><pubDate>Wed, 26 Jul 2006 12:57:00 GMT</pubDate><guid>http://m.tkk7.com/coffeecat/archive/2006/07/26/60247.html</guid><wfw:comment>http://m.tkk7.com/coffeecat/comments/60247.html</wfw:comment><comments>http://m.tkk7.com/coffeecat/archive/2006/07/26/60247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/coffeecat/comments/commentRss/60247.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/coffeecat/services/trackbacks/60247.html</trackback:ping><description><![CDATA[ <a >http://www.yaosansi.com/blog/article.asp?id=551</a> <br /> <img src ="http://m.tkk7.com/coffeecat/aggbug/60247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/coffeecat/" target="_blank">KevinGong</a> 2006-07-26 20:57 <a href="http://m.tkk7.com/coffeecat/archive/2006/07/26/60247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>没有Javascript,UCSS下拉菜单-IE,FFhttp://m.tkk7.com/coffeecat/archive/2006/06/01/49388.htmlKevinGongKevinGongWed, 31 May 2006 23:04:00 GMThttp://m.tkk7.com/coffeecat/archive/2006/06/01/49388.htmlhttp://m.tkk7.com/coffeecat/comments/49388.htmlhttp://m.tkk7.com/coffeecat/archive/2006/06/01/49388.html#Feedback0http://m.tkk7.com/coffeecat/comments/commentRss/49388.htmlhttp://m.tkk7.com/coffeecat/services/trackbacks/49388.html阅读全文

KevinGong 2006-06-01 07:04 发表评论
]]>
վ֩ģ壺 һ234 | Ůһ| ޹߶| ó˾þAvѸ| ɫվwwwһ | ٸƷһѶ̬ | ѻɫַ| պƷAV| Ļȫ| ޳վ߹ۿ| ˬִ̼߳| ޾Һվ| ŮƵվ| ޹˾þþƷ | Ƶ߹ۿ| ޾ƷĻ| ëƬڵ߳| av˾Ʒһ | þþƷۺһƷ| ޾ƷƵ| һɫþ88޾Ʒۺ| ʵŹ| aaëƬëƬѹۿ| ޹ۺ91Ʒ鶹| Ůվѿվ| AV˾Ʒһ| ޹˾ƷŮ˾þþ| aƷžžŴƬѿ| þ޹˾Ʒɫ| ŮƵ| һؼŮ18ëƬƵ | av÷ۺ| 㽶þþƷ | XX00Ƶ| ȫëƬ߲| ޹Ʒۿþ| AVֻ߹ۿ| ޾Ʒվ| þƵһ| պƷĻ| ɫͼС˵ר|