📄 java media framework 基础教程 - oscar999的专栏 - csdnblog.htm
字号:
href="http://blog.csdn.net/oscar999/archive/2006/12/05/1431111.aspx">下一篇: 逐日思程</A></DIV></SPAN><BR>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>
<DIV class=post>
<DIV class=postTitle>
<SCRIPT
src="Java Media Framework 基础教程 - oscar999的专栏 - CSDNBlog.files/vote.js"></SCRIPT>
<A href="http://blog.csdn.net/oscar999/archive/2006/12/11/1438694.aspx"><IMG
height=13
src="Java Media Framework 基础教程 - oscar999的专栏 - CSDNBlog.files/zhuan.gif"
width=15 border=0> Java Media Framework 基础教程</A>
<SCRIPT
src="Java Media Framework 基础教程 - oscar999的专栏 - CSDNBlog.files/count.htm"></SCRIPT>
</DIV>
<DIV class=postText>
<DIV class=title>
<H2>Java Media Framework 基础教程</H2><A
href="http://www.matrix.org.cn/resource/article/43/user.shtml?userid=85240"><BR>作者:Eric
Olson 来源:ibm<BR></A></DIV><!-- end of div title -->
<DIV class=summary>
<DIV class=left><A
href="http://www.matrix.org.cn/resource/article/43/user.shtml?userid=85240"></A></DIV>
<DIV class=center>
<H4><A
href="http://www.matrix.org.cn/resource/article/43/user.shtml?userid=85240">摘要:</A></H4><A
href="http://www.matrix.org.cn/resource/article/43/user.shtml?userid=85240">很少发现有关于jmf方面的中文资料,这是在IBM上面找的一本书,可作为jmf的入门学习,业余时间翻译了。全书从三个例子入手,简单的介绍了jmf的使用。
</A></DIV>
<DIV class=right>
<DIV class=help>
<H4><A
href="http://www.matrix.org.cn/resource/article/43/user.shtml?userid=85240">工具箱</A></H4><A
href="http://www.matrix.org.cn/favorite.shtml?type=article&title=Java%2520Media%2520Framework%2520%25E5%259F%25BA%25E7%25A1%2580%25E6%2595%2599%25E7%25A8%258B&url=resource%2Farticle%2F43%2F43883_JMF.html">本站收藏</A><BR><A
onclick="javascript:location.href='http://del.icio.us/post?&url=' _fcksavedurl='http://del.icio.us/post?&url=' _fcksavedurl='http://del.icio.us/post?&url=' _fcksavedurl='http://del.icio.us/post?&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)"
href="http://www.matrix.org.cn/resource/article/43/43883_JMF.html#">美味书签</A><BR><A
href="http://www.matrix.org.cn/resource/article/43/43883_JMF.html#avote">投票评分</A><BR><A
href="http://www.matrix.org.cn/resource/article/43/43883_JMF.html#areview">发表评论</A><BR><A
title=点击后直接粘贴即可 onclick=copyLink();
href="http://www.matrix.org.cn/resource/article/43/43883_JMF.html#">复制链接</A><BR></DIV></DIV></DIV><!-- end of summary line -->
<CENTER><STRONG><SPAN
style="FONT-SIZE: 20px">Java媒体架构基础</SPAN></STRONG></CENTER><BR><BR><BR><BR><SPAN
style="COLOR: red">内容表格</SPAN><BR><SPAN style="COLOR: blue">1. 关于此指南<BR>2.
一个简单的音频播放器<BR>3. JMF用户接口组件<BR>4. JMF概念<BR>5. 传播和接收媒体<BR>6.
总结以及资源</SPAN><BR><BR><BR><STRONG><SPAN style="FONT-SIZE: 16px">第一节.
关于此指南</SPAN></STRONG><BR><BR>此指南包含的内容?<BR><BR>Java
媒体架构(JMF)是一个令人激动的通用的API,它允许Java开发者用许多不同的方法处理媒体。本指南主要通过使用工作的例子提供一个JMF的一些主
要的特征的概述。阅读完本指南后,你将会明白JMF体系结构中的主要播放功能。你同样能正确的使用JMF,使用现存的例子和可为更多特殊功能扩展的源代
码。<BR><BR>本指南包含着以下主题:<BR>· 下载和安装JMF<BR>· 主要的JMF类以及它们在JMF体系结构中的应用<BR>·
播放本地的媒体文件<BR>· 为媒体的存取和操作制作以和图形用户界面(GUI)<BR>· 通过网络传播媒体<BR>·
通过网络接收媒体<BR><BR>几乎所有的媒体类型的操作和处理都可以通过JMF来实现。全面的讨论JMF所提供的所有特征已经超过了本指南的范围,我们将使用三个简单的媒体应用程序来学习此框架的构建模块。通过这个方法,本指南将为你未来学习和实施更多特殊的应用提供准备。<BR>我应该使用此指南吗?<BR><BR>本指南会带你学习使用JMF工作的基础。为完成这些,我们会创建三个的独立工作的例程序。每个例子都会建立前一个例子的基础上,显示JMF功能性的不同方面。<BR>在
本指南中的例子假定你曾经使用过并且已经熟悉了Java程序语言。除了Java核心和JMF的类之外,我们会使用一些Java
AWT和Swing类(用于创建GUI),也会有一些Java网络类(用于在网络中传输媒体)。对GUI和网络类一些熟悉有助于你更快的明白观点和这里的
例子,但并非是阅读本指南必须的。<BR><BR><STRONG>我们将学习的例程序如下</STRONG><BR>·
一个简单的音频播放器(JMF的HelloWorld应用):这个字符界面的播放器通过在命令行中简单的输入媒体文件的名字就可以播放大多数的音频类型。此音频播放器的演示大体上显示了JMF的特有的类。<BR>·
一个图形界面的媒体播放器:我们将使用JMF内置的接口组件来建立图形界面,所以在此练习中必须有一些图形界面的编程经验。这个媒体阅览器演示使用了一些Java
AWT和Swing类来为用户显示图形组件。<BR>·
一个媒体广播应用:此应用程序允许一个本地媒体文件通过网络传播。此程序能灵活的使媒体只传输到指定的网络节点,或者传输到一个子网络中的所有节点。此演示使用了一些Java的网络APIs来在网络中传输媒体。<BR>作为第三个练习的一部分,我们将修改图形界面的播放器,让其能接收并且播放媒体。<BR>跳至23页观看Resources,文章,指南,和其他参考书目的列表,这会帮助你学习到更到关于此指南包括的主题。<BR><BR><STRONG>安装需求</STRONG><BR>要运行此指南中的例程序,你需要如下的工具和组件:<BR>· Java
2 平台,标准版,编译和运行演示程序<BR>· Java媒体框架,版本2.1.1a或者更高<BR>·
一块已经安装并且配置号的适当的声卡<BR>· 一台或者多台测试机器<BR>·
演示的源代码文件在mediaplayer.jar中<BR>最后的一个演示应用显示了JMF在网络中的应用。如果需要,此演示能运行在一个独立的机器上,使用此机器即是传输方也是接收方。可是要观察到在网络中使用JMF的所有功能,你仍然需要至少两台联网的机器。<BR>在23页中的Resources可下载Java
2平台,完整的源代码文件,以及其他一些完成本指南所需要的工具。<BR><BR><STRONG>下载安装文件</STRONG><BR>将JMF安装到你的计算机中的第一步是在JMF的主页中下载安装文件,它同样包括了JMF源代码和API文档的链接。23页的Resources中有下载JMF的链接。<BR>目
前,JMF有Windows, Solaris,
Linux等版本,以及可运行在任何装有虚拟机的计算机上一个纯Java版本。为了增加性能,你需要下载一个与你操作系统所适应的版本。任何在一个操作系
统JMF版本下书写和编译的代码都可以方便的移植到另外的操作系统上。例如,如果你下载了一个Solaris版本的JMF并且编译了一个类,这些类就可以
在Linux上使用,不会有任何问题。<BR>作为选择,你可以选择下载纯Java版本,或者跨平台版本的JMF。这些版本没有使用操作系统特有的库文件。如果没有合适的JMF版本适合的操作系统,那么跨平台版本就是一个不错的选择。<BR><BR><STRONG>安装JMF</STRONG><BR>下载完JMF安装程序后,双击安装程序的图标。<BR>大部分安装程序都会有个选项,安装本地库到系统目录中;例如,Windows版本安装程序会有一个选项“Move
DLLs to Windows/System
directory.”。最好将此选项选中,因为它能确保这些操作系统的库文件能正确的安装<BR>在安装的过程中,你还需要选择项目来更新系统的CLASSPATH和PATH变量。如果这些选项被关闭,那么在你编译和运行本指南的例程序的时候就需要在classpath中引入JMF的jar文件。<BR><BR><STRONG>关于作者</STRONG><BR>Eric
Olson在Retek Inc工作的软件工程师。它在Java平台上有四年的工作经验,并且在不同的基于Java的技术上富有经验,包括JMF, Jini,
Jiro, JSP, servlets, and EJBs。Eric毕业于St. Paul, MN的St.
Thomas大学,获得计算机科学的学位。他在IBM的SanFrancisco项目组工作,负责WebSphere商业组件。他同时再为Imation
Corp.工作,负责存储应用。现在,他正在开发零售行业的基于web的软件解决方案。再业余的时间,Eric和Paul<BR>Monday在Stereo
Beacon上合作—一个分布式的点对点的基于JMF的媒体播放器。联系<BR>Eric
zpalffy@yahoo.com.<BR><BR><STRONG><SPAN style="FONT-SIZE: 16px">第二节.
一个简单的音频播放器</SPAN></STRONG><BR><STRONG>浏览</STRONG><BR>在本节中,我们将进行创建一个简单的音频播放器的第一个练习。本例将介绍Manager类和Player接口,中两个都是建立大多数基于JMF应用的重要部分。<BR>本例的功能目标是在字符界面下播放本地的音频文件。我们将学习此源代码,并了解每一行所做的任务。完成本节后,你将会有一个基于JMF的可播放包括MP3,
WAV,
AU等多种音频文件的演示程序。<BR>在本练习后的源代码分类种可查询文件SimpleAudioPlayer.java。<BR><BR><STRONG>引入必要的类</STRONG><BR>SimpleAudioPlayer类中包括了一些调用,在其前几行中需要引入所有必要的类:<BR>import
javax.media.*;<BR>import java.io.File;<BR>import java.io.IOException;<BR>import
java.net.URL;<BR>import java.net.MalformedURLException;<BR><BR>The
javax.media包是由JMF定义的多个包之一。javax.media是一个核心包,包括了定义Manager类和Player接口等。本节中,我们主要学习Manager类和Player接口,其余的javax.media类放在后面的章节中。<BR>除了引入javax.media声明外,以上的代码片断引入了一些创建媒体播放器的输入的声明。<BR><BR><STRONG>Player接口</STRONG><BR>在下面的代码片断中,创建一个公共类SimpleAudioPlayer并举例定义一个Player变量:<BR><PRE class=overflow>public class SimpleAudioPlayer {<BR>private Player audioPlayer = null;</PRE><BR>术
语Player听起来由点熟悉,因为它是建立在我们公用的音频或者视频播放器的基础上的。事实上,这个接口的例子就像是当作它们的真实的副本。
Players揭示了一个实体上的媒体播放器(如立体音箱系统或者VCR)涉及到功能上的方法。例如,一个JMF媒体播放器可以开始和结束一个媒体流。在
本节种,我们将使用Player的开始和结束功能。<BR><BR><STRONG>在一个文件上创建一个Player</STRONG><BR>使用JMF获得一个特定媒体文件的Player实例非常简单。Manager类在JMF中如同一个工厂制作许多的特殊接口类型,包括Player接口。因此,Manager类的责任就是创建Player实例,如下例:<BR><PRE class=overflow>public SimpleAudioPlayer(URL url) throws IOException,<BR>NoPlayerException,<BR>CannotRealizeException {<BR>audioPlayer = Manager.createRealizedPlayer(url);<BR>}<BR>public SimpleAudioPlayer(File file) throws IOException,<BR>NoPlayerException,<BR>CannotRealizeException {<BR>this(file.toURL());<BR>}</PRE><BR><BR>如果你看完本节的代码,你可以注意到Manager类包含了创建一个Player实例的其他方法。我们会研究其中的一些,如在后面的章节中的DataSource或者MediaLocator的实例化。<BR><BR><STRONG>Player的状态</STRONG><BR>JMF定义了大量的一个Player实例可能存在的不同状态。如下:<BR>·
Prefetched<BR>· Prefetching<BR>· Realized<BR>· Realizing<BR>· Started<BR>·
Unrealized<BR><BR><STRONG>使用这些状态</STRONG><BR>因
为使用媒体常常是资源非常密集的,由JMF对象揭示的许多方法都是不闭塞的,允许一系列事件监听的状态改变的异步通知。例如,一个Player在它可以启
动之前,必须经过Prefetched和Realized状态。由于这些状态的改变都需要一些时间来完成,JMF媒体应用可以分配一个线程来初始化创建
Player实例,然后再继续其他的操作。当Player准备就绪的时候,它会通知应用程序其状态已经改变。<BR><BR>在一个如同我们的这样简单的
程序中,多功能性的类型并不是很重要。处于这个原因,Manager类也提供了一些创建Realized
player的有用方法。调用一个createRealizedPlayer()方法来阻塞调用线程,直到player达到Realized状态。为了调
用一个无阻塞的创建player的方法,我们在Manager类中使用了一个createPlayer()方法。下面的一行代码中创建了一个我们需要在例
程序中使用的<BR><PRE class=overflow>Realized player:<BR>audioPlayer = Manager.createRealizedPlayer(url);</PRE><BR><BR><STRONG>启动和停止Player</STRONG><BR>设定一个Player实例的启动或是停止就如同调用Player的一个简单的认证方法,如下所示:<BR><PRE class=overflow>public void play() {<BR>audioPlayer.start();<BR>}<BR>public void stop() {<BR>audioPlayer.stop();<BR>audioPlayer.close();<BR>}</PRE><BR>调用SimpleAudioPlayer类中的play()方法来实现调用Player实例的start()方法。调用此方法后,你能听到本地的喇叭的声音文件。同样的,stop()方法使player停止并且关闭掉Player对象。<BR><BR>对
于读取和或者播放本地媒体文件来说,关闭Player实例释放所有资源是一个有用的方法。因为这是一个简单的例子,关闭Player是终止一个会话可接受
的方法。但是在实际的应用中,你需要小心的确认在除掉Player之前必须要关闭掉。一但你已经关闭掉player,在再次播放一个媒体之前你必须要创建
一个新的Player实例(等待它的状态改变)。<BR><BR><STRONG>建立一个SimpleAudioPlayer</STRONG><BR><BR>最后,这个媒体播放应用程序要包含一个可以从命令提示行中输入命令而调用的main()方法。在此main()方法中,我们将调用创建SimpleAudioPlayer的方法:<BR><PRE class=overflow>File audioFile = new File(args[0]);<BR>SimpleAudioPlayer player = new SimpleAudioPlayer(audioFile);</PRE><BR><BR>在播放音频文件之前的唯一的一些事情就是调用已经创建的音频player的方法play(),如下所示:<BR><BR><PRE class=overflow>player.play();</PRE><BR><BR>要停止和清除掉音频player,在main()方法中也应该有如下调用:<BR><PRE class=overflow>player.stop();</PRE><BR><BR><STRONG>编译和运行SimpleAudioPlayer</STRONG><BR>通过在命令提示行输入javac
SimpleAudioPlayer.java来编译例程序。所创建的文件SimpleAudioPlayer.class在当前工作目录中。<BR>然后在命令提示行中键入如下命令来运行例程序:<BR><PRE class=overflow>java SimpleAudioPlayer audioFile</PRE><BR>将audioFile替换成你本地机器上的音频文件。所有的相对文件名都试相对于当前的工作目录。你会看到一些当前正在播放文件的标志信息。要终止播放,按下回车键。<BR>如果编译失败,确认JMF的jar文件已经正确的包含在CLASSPATH环境变量中。<BR><BR><BR><STRONG><SPAN
style="FONT-SIZE: 16px">第三节.
JMF用户界面组件</SPAN></STRONG><BR><STRONG>播放视频</STRONG><BR>在
前一节中,我们学习了建立一个通过字符界面播放音频文件的应用程序。JMF中一个最重要的特点就是你不需要为了配置媒体播放器而去了解媒体文件的格式;一
切都内置了。举一个例子,再我们前面的例子中,需要使用MP3格式的时候,我们不需要让应用程序为一个MP3文件建立一个特殊的Player。<BR>如同你将会再本节所见到的,对于视频文件的操作同样有效。JMF有所有媒体文件类型接口的详细资料。<BR>处理视频媒体与音频最大的不同就是,我们必须建立一个能播放视频的显示屏幕。幸运的是,JMF能处理许多的这些资料。如同再上例一样我们会建立一个Player对象,并且使用很多的可视组件来直接从JMF对象中创建我们的可视的媒体浏览器。<BR>本节中,我们将学习两个例程序。In
this section, we'll walk through the second example application.
请再后面的练习的源代码分布中查阅MediaPlayerFrame.java。<BR><BR><STRONG>关于例子</STRONG><BR>在
本节中,我们将创建一个能显示和运行本地音频和视频媒体的应用程序。作为练习的一部分,我们将研究JMF内置的一些GUI组件。熟悉AWT和Swing将
有助于你理解本例,但这并不是必须的。除非需要直接涉及到JMF的GUI组件,或者我们是不会详细介绍源代码的。你可以在源代码的注释中找到这里未涉及的
详细说明。<BR>本例中我们使用的许多概念,类和方法都和第一个例子的类似。建立Player的基本操作大都一样。最大的不同就是我们需要对Player对象专研更深一点,特别当需要从Player获取媒体信息的时候。<BR><BR><STRONG>如何开始</STRONG><BR>视频播放器例子被设计得如同音频播放例子一样通过命令行来运行,但是本例需要建立在GUI基础上。如同在上节一样,我们先通过媒体文件名调用应用。然后,应用程序显示一个带有可操作媒体组件的窗体。<BR>在MediaPlayerFrame开始的一行中我们定义了类并扩展自,javax.swing.Jframe类。这就是使媒体播放器如同一个在桌面上的单独窗体的方法。任何客户机程序创建了本媒体播放对象后都可以通过调用Jframe类中定义的show()方法来显示。<BR>下面是一个MediaPlayerFrame正在播放MPEG电影的屏幕截图:<BR><BR><STRONG>获取GUI组件</STRONG><BR>Player界面有一些方法来获取已选择可视组件的涉及。在MediaPlayerFrame中,我们使用如下组件:<BR>·
player.getVisualComponent()是一个播放所有视频媒体的可视组件。<BR>·
player.getControlPanelComponent() 是一个操作时间轴的可视组件(包括开始,停止,回放),也包含了一些媒体流的有用信息。<BR>·
player.getGainControl().getControlComponent()
是操作音量(增加)的可视组件。getGainControl()方法返回一个GainControl实例,可用于改变节目的增加等级。<BR><BR><STRONG>使用可视化组件</STRONG><BR>上面的界面方法都返回一个java.awt.Component类的实例。没个实例都视可加载到我们窗体上的可视组件。这些组件都与Player有直接的联系,所以在这些组件上的所有可视元素的处理都会产生Player播放媒体后相应的变化。<BR>在
我们将这些组件加入到我们的窗体的之前,必须要保证它们不为空。因为并不是所有的媒体播放器包括每一种可视组件,我们只需添加相关播放器类型的组件。比
如,一般来说一个音频播放器没有可视组件,所以getVisualComponent()就要返回空。你不会想在音频播放器窗体上添加可视组件的。<BR><BR><STRONG>获得媒体的特殊控制</STRONG><BR>一
个Player实例也可以通过getControl()和getControls()方法来暴露其控制,getControls()返回一个控制对象集,
而getControl()返回一个控制。不同的播放器类型可选择为特殊的操作来暴露控制集去指定的媒体类型,或者用于获取该媒体的传输机制。如果你在写
一个只支持某些媒体类型的播放器,你需要依靠某些在Player实例中可用Control对象。<BR>由于我们的播放器是非常抽象的,被设计于播放多种
不同媒体类型,我们简单的为用户暴露所有的Control对象。如果找到任何扩展的控制集,我们就可使用getControlComponent()方法
来增加相应的可视控件到标签面板上。通过这个办法,用户就可以观察播放器上的所有组件。以下代码片断将所有的控制对象暴露给用户:<BR><PRE class=overflow>Control[] controls = player.getControls();<BR>for (int i = 0; i < controls.length; i++) {<BR>if (controls[i].getControlComponent() != null) {<BR>tabPane.add(controls[i].getControlComponent());<BR>}<BR>}</PRE><BR>为
了使一个真实的应用程序能用Control实例做一些有用的事(除了能显示可视组件之外),应用程序需要知道该Control的特殊类型,并分配它。此
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -