📄 java media framework 基础教程 - oscar999的专栏 - csdnblog.htm
字号:
后,应用程序就可使用这些control来控制媒体节目了。例如,如果你知道你经常使用的媒体暴露
javax.media.control.QualityControl类型的Control,你能使用QualityControl界面,之后在
QualityControl界面上通过调用各种方法来改变性质设定。<BR><BR><STRONG>使用一个MediaLocator</STRONG><BR>在我们新的基于GUI的媒体播放器和我们的第一个简单播放器之间最大的不同就是,我们使用一个MediaLocator对象而不是URL来创建Player实例,如下所示:<BR><PRE class=overflow>public void setMediaLocator(MediaLocator locator) throws IOException,<BR>NoPlayerException, CannotRealizeException {<BR>setPlayer(Manager.createRealizedPlayer(locator));<BR>}</PRE><BR>我
们将在稍后的章节中讨论这个变化的原因。目前,在网络上资源站点上,关于MediaLocator对象和URL的描述被认为是非常相似的。事实上,你可以
从一个URL创建一个MediaLocator,也可以从MediaLocator获取到URL。我们的新媒体播放器一个URL中创建一个
MediaLocator,并使用该MediaLocator通过文件创建了一个Player。<BR><BR><STRONG>编译和运行MediaPlayerFrame</STRONG><BR>通过在命令提示行输入javac
MediaPlayerFrame.java来编译例程序。在工作目录下将创建一个名为MediaPlayerFrame.class的文件。<BR>在命令提示行中键入如下来运行例程序:<BR><PRE class=overflow>java MediaPlayerFrame mediaFile</PRE><BR>你需要用你本机上的一个媒体文件来替换掉mediaFile(音频或者视频文件都可以)。所有的相对文件名都是相对于当前工作目录。你会看见一个显示控制媒体文件的GUI控制集的窗口。欲了解JMF支持的音频和视频文件列表,在23页的资源。<BR>如果初始编译时失败,请确认JMF的jar文件已经包含在当前的CLASSPATH环境变量中。<BR><BR><STRONG>MediaPlayerFrame在行动</STRONG><BR>在本节前你看见的一个视频播放器正在播放MPEG视频文件的屏幕截图。下面的屏幕截图显示了一个音频播放器正在播放一个MP3文件:<BR>要更多的学习本练习中的例子,查看完成的MediaPlayerFrame源代码。<BR><BR><STRONG><SPAN
style="FONT-SIZE: 16px">第四节.
JMF概念</SPAN></STRONG><BR><STRONG>JMF体系结构</STRONG><BR>你
曾见过了使用JMF播放本地媒体文件是多么的容易,现在我们将后退一步,来看看一幅是如何通过JMF创建了如此成熟的基于媒体的应用程序的大的画面,是如
何通过JMF创建了如此成熟的基于媒体的应用程序。全面的了解JMF体系结构是没有意义的,本节将给你一个大体的概念,关于高级的JMF组件是如何组合起
来创建想得到的东西。<BR>JMF的组件结构非常的灵活,它的组件一般可以分成三个部分:<BR>·
Input描述某种被用于在进程休息的时候作为一个输入的媒体。<BR>· process执行某些输入上的活动。一个过程有一个明确的输入和输出。大量的过程可用,
能被用于一个输入或者一批输入。这些过程能被联系起来,一个过程的输出被用于另外一个过程的输入。在这种风格中,大量的过程可能被应用于一个输入。(这段
期间是可选择的——我们开始的两个例子没有包含真正的数据过程,只有一个来自文件的输入和一个通过Player的输出。)<BR>· Output
描述了媒体的某些目的地。<BR><BR>从这些描述中,你可以想象到JMF组件体系结构听起来就好像在一个典型的立体声系统或者VCR之后。很容易设想到,使用JMF就如同打开电视或者在立体声音箱系统下调节声音的风格。例如,录制喜爱的电视节目的简单的动作能在这些组件的基础中:<BR>·
Input 是电视广播流,在同一个频道运输音频和视频。<BR>· Process
是一个记录设备(就是,一个VCR或者许多的数字设备)转换模拟或者数字音频视频广播流成适合复制到磁带或其他媒体上的格式。<BR>· Output
是记录已格式化轨迹(音频和视频)到某些类型的媒体上。<BR><BR><STRONG>JMF资料处理模式</STRONG><BR>以下图片说明了JMF数据处理模块并对每个类型给出了例子:<BR>使用此模式,很容易明白我们前面的两个例子,从文件中输入音频和视频并输出到本地计算机上。在后面的章节中,我们也会谈论一些通过传播和接收音频媒体的JMF网络功能。<BR><BR><STRONG>处理模型例子</STRONG><BR>将JMF
的输入,处理和输出模式联系起来,我们能开始想象许多基于媒体的操作都可能通过JMF完成。一个例子,转换一种媒体类型为其他类型并将其输出存储到一个新
的文件。举一个例子,我们想要在不损坏原始文件的前提下转化一个WAV格式的音频文件为MP3格式。以下的过程模式插图,就是我们将开始执行转换的步骤:<BR>本例的输入是一个WAV文件。它被一个媒体格式转换工具加工,并输出到一个新的文件。现在,让我们看看JMF
API中的这个模式的每一步。我们使用输入,处理和输出模式作为概念上的路标。<BR><BR><STRONG>JMF输入</STRONG><BR>再JMF中,一般由一个MediaLocator对象来描述一个输入。如先前规定的,<BR>MediaLocator的外观和行为都非常象一个URL,这样它可以唯一确定网络上的一个资源。事实上,使用一个URL来创建一个MediaLocator是完全可能的;我们在前面的两个例子中就是这样做的。<BR>为
了我们的媒体转换例子,我们需要建立一个MediaLocator来描述最初的WAV文件。如同我们将在后面的章节中见到的,一个
MediaLocator也可以用于描述一个跨越网络中媒体流。在这个案例中,MediaLocator会描述传播的URL――很像一个被URL指定的在
Web上的资源,用于取代指定一个本地文件系统的文件来建立MediaLocator。<BR><BR><STRONG>一个MediaLocator和一个URL之间的不同</STRONG><BR>要
成功的建立一个URL对象,需要适当的java.net.URLStreamHandler安装于系统中。这个流处理的用途是能够处理被URL描述的流类
型。一个MediaLocator对象并没有这个需要。例如,我们的下个应用程序将使用实时传输协议(RTP)在网络上传输音频。由于多数的系统都未为
RTP协议安装一个URLStreamHandler,所以创建一个URL对象会失败。在这个应用中,只有MediaLocator对象会成功。<BR>要理解更多关于URL对象以及创建和注册一个URLStreamHandler的信息,查阅JDK帮助文档(查看23页资源)。<BR><BR><STRONG>JMF处理机</STRONG><BR>当
我们使用JMF的时候,应用程序的处理机组件被Processor接口实例描述。你需要已有些熟悉Processor,它扩展至Player接口。由于
Processor继承直Player接口,它同样也从Player继承所有可用属性。另外,Processor增加了两个属性:Configuring
和Configured。这些扩展的属性(和与之关联的方法)用于Processor从输入流收集信息时的通信。<BR>在我们的最后的例程序中,我们将建立一个Processor用于将MP3编码格式的音频转换成适合在网络上传播的格式。在稍后的板块中我们会讨论创建一个简单的Processor的步骤。<BR><BR><STRONG>JMF输出</STRONG><BR>有
少许的方法用于描述JMF中处理模式的输出状态。最简单的(并且我们将在最后一个例子中使用的)是javax.media.DataSink接口。一个
DataSink读取媒体内容并且将其传送到一些目的地。本节中最开始的音频格式转换过程中,MP3(输出)文件将被DataSink描述。在我们最后一
个例子中,我们将使用一个DataSink在实际上完成网络中传播音频媒体的工作。一个DataSink是在Manager类中,由指定一个
DataSource(输入到DataSink)和一个MediaLocator(输出到DataSink)完成的。<BR>一个DataSource实例描述可用于Players,Processors和DataSinks的输入数据。一个处理机的输出也被描述成一个DataSource对象。<BR>这就是为什么处理器能彼此联系起来,在同一媒体数据中完成多种操作。这也是来自Processor的输出能作为输入被Player或者DataSink使用的原因(它可将媒体传递到输出目的地)。<BR>一个DataSink的最后目的文件由一个MediaLocator对象说明。如同前面一样,MediaLocator描述一个网络资源;这就是媒体流将被传递的地方。<BR><BR><STRONG><SPAN
style="FONT-SIZE: 16px">第五节.传播接收媒体</SPAN></STRONG><BR><STRONG>JMF和实时传输协议(RTP)</STRONG><BR>许
多的友善网络的特征直接建立在JMF中,这些使为客户端程序通过网络传输和接收媒体非常容易。当在一个网络上的一个用户想要接收任何种类的媒体流的时候,
它不需要在观看媒体前等待全部的广播下载到机器上;用户可以实时的观看广播。在流媒体中些提出了这个概念。通过流媒体,一个网络客户端能接收到其他机器上
广播的音频,甚至获取正在发生的实况视频广播。<BR>在IETF RFC
1889中定义了实时传输协议(RTP)。发展在快速和可靠的状态下通过网络传输时间极其敏感的数据,RTP在JMF中用于提供给用户向其他网络节点中传输媒体流的方法。<BR>在
本节中,我们将学习我们的最后一个例程序。这里,你将学习到如何传输一个存储在一台机器上的MP3文件到另外的在同一个网络的机器上去。实际的MP3源文
件并不从主计算机上移除,它也不使复制到其他机器上去;事实上它将会转换成能使用RTP传输的文件格式并通过网络发送。一旦被一个客户端接收到,源文件
(现在是RTP信息包的形式)可以再次传输,这一次是在接收机器上可播放的一种格式。<BR>在MediaTransmitter.java文件中源代码查看学习以下练习。<BR><BR><STRONG>设置处理模式</STRONG><BR>我们可以在前面的章节中定义的处理模式的基础下来讨论我们的最终的例子。在传输机器上,处理模式看起来像这样:<BR>事实上,MediaTransmitter对象源代码包括了以下三行:<BR><PRE class=overflow>private MediaLocator mediaLocator = null;<BR>private DataSink dataSink = null;<BR>private Processor mediaProcessor = null;</PRE><BR><BR>这三个实例变量可以直接映射到前面的处理模式图表,如下:<BR>· mediaProcessor变量是我们的处理器;它将负责转换音频文件从MP3文件模式到一个适合通过RTP协议传输的格式。<BR>· dataSink变量是我们的输出块。<BR>·
当我们建立DataSink时我们需要指定一个MediaLocator,它是DataSink的目的文件。<BR><BR>当我们通过运行DataSink我们的处理过的媒体,它将传输到我们在MediaLocator中指定的地点。<BR><BR><STRONG>RTP
MediaLocator</STRONG><BR>在 前面的两个练习中,我们通过从文件中获得的一个URL建立了MediaLocator实例。
在本练习中,我们必须建立一个MediaLocator来描述网络上媒体传播输出流;换句话说,我们必须创建一个能我们的音频传播的目的地的
MediaLocator。一个RTP MediaLocator符合如下规则,看起来就像一个典型的URL:<BR><PRE class=overflow>rtp://address:port/content-type</PRE><BR><BR>让我们看看上面URL规范的每一段:<BR>·
address 是将传输的媒体的地址。以单播的模式传输(一个专用IP地址),地址将会是有意接收的机器的IP地址。以广播的模式传播(到子网中的所有机器),地址将会
是以255作为最后的一块的子网地址。举个例子,如果我再子网中可指定地址为192.168.1和想要传播到子网中的所有节点,我可以指定
192.168.1.255作为地址;这样允许子网中的每个节点监听广播媒体。<BR>· port 必须是被传输者和接收者都允许的一个端口。<BR>·
content-type
是媒体流类型。在我们的案子中,这个将会是音频。<BR>下面的一个简单的RTP传播MediaLocator例子会让所有在指定网络中的机器接收到媒体流:<BR><PRE class=overflow>rtp://192.168.1.255:49150/audio</PRE><BR><BR><STRONG>创建一个处理机</STRONG><BR>在setDataSource()方法中我们首先要做的就是创建一个Processor实例。<BR>下面的Processor的职责是转换MP3音频媒体为一个RTP来表示:<BR>public
void setDataSource(DataSource ds) throws IOException,<BR>NoProcessorException,
CannotRealizeException, NoDataSinkException {<BR>mediaProcessor =
Manager.createRealizedProcessor(<BR>new ProcessorModel(ds, FORMATS,
CONTENT_DESCRIPTOR));<BR>在Manager类中,我们能创建一个Processor对象,通过两种方法中的一种:<BR>createProcessor
()或者createRealizedProcessor()。你很可能会注意到这两个方法样式的显示和前面例子中创建一个Player的方法很相似。在
目前的例子中,我们将创建一个已实现的Processor。我们这样做是因为我们使用的应用非常简单,在Processo处于Realized状态时我们
不需要关心任何真实的工作。<BR><BR><STRONG>创建一个ProcessorModel</STRONG><BR>创建一个已实现的Processor,我们需要创建一个为Processor描述输入和输出媒体类型的ProcessorModel实例。为了创建ProcessorModel,我们需要下面的一些:<BR>·
一个DataSource,将被处理的媒体(输入文件)。<BR>· 一个javax.media.Format数组,描述输入媒体的格式。<BR>·
一个javax.media.protocol.ContentDescriptor实例,为我们的处理机描述输出格式。传送者的DataSource是通过一个参数传递到此方法。<BR><BR><STRONG>定义输入和输出格式</STRONG><BR>因
为我们的MediaTransmitter类会被时常用于将输入媒体格式(MP3)转换成一种输出格式(音频RTP),中学对象被定义成静态。我们创建一
个新的javax.media.format.AudioFormat实例用于描述媒体输入类型(在java帮助文档中查看可用格式)。这就是我们的处理
机可以获取MP3音频文件的原因。<BR>我们也创建一个javax.media.protocol.ContentDescriptor实例来描述想要处理机输出的。在我们的案子中,这是一个RTP媒体流。<BR><BR>这就是为什么我们的处理机可以只制造RTP流。<BR>下面的代码片断显示了我们如何设置格式和内容描述符变量,用于创建ProcessorModel对象:<BR><PRE class=overflow>private static final Format[] FORMATS = new Format[] {<BR>new AudioFormat(AudioFormat.MPEG_RTP)};<BR>private static final ContentDescriptor CONTENT_DESCRIPTOR =<BR>new ContentDescriptor(ContentDescriptor.RAW_RTP);</PRE><BR><BR><STRONG>连接输入,处理机和输出</STRONG><BR>现在我们有一个处于Realized状态的Processor,我们需要设置DataSink以能实际上传播RTP媒体。创建DataSink是简单的大概使用另外一个调用给Manager对象,如下所示:<BR><BR><PRE class=overflow>dataSink = Manager.createDataSink(mediaProcessor.getDataOutput(),<BR>mediaLocator);</PRE><BR><BR>createDataSink
()方法获取新Processor的输出(作为一个DataSource参数)和MediaLocator对象,我们和MediaTransmitter
对象同时建立的。通过这样,你能开始我们的不同的组件是如何在处理模式中联系起来的:我们从一个Processor中获取输出并使用他们作为输入到其他组
件。在这个特殊的应用中,Processor输出用于传输媒体的DataSink的一个输入。<BR><BR><STRONG>创建一个DataSource实例</STRONG><BR>在这点上,我们全部都是做和设置我们的媒体播放器的广播传输。<BR>我们需要创建DataSource对象,我们用于创建处理机(就是,在我们的MediaTransmitter中,参数传递到setDataSource()方法)。下面是创建一个DataSource实例的代码:<BR><PRE class=overflow>File mediaFile = new File(args[1]);<BR>DataSource source = Manager.createDataSource(new MediaLocator(<BR>mediaFile.toURL()));</PRE><BR><BR>这
段代码是在MediaTransmitter对象中的vmain()方法。这里我们通过从命令行输入的第二个参数创建一个File对象。我们通过文件创建
一个MediaLocator,而后通过位置创建一个DataSource。这个新近创建的DataSource是一个涉及到传送者的输入文件。我们能使
用这个DataSource初始化传输者。<BR><BR><STRONG>开始和停止MediaTransmitter</STRONG><BR>我们通过调用其中的startTransmitting()方法来开始MediaTransmitter,如下所示:<BR><PRE class=overflow>public void startTransmitting() throws IOException {<BR>mediaProcessor.start();<BR>dataSink.open();<BR>dataSink.start();<BR>}</PRE><BR><BR>这个方法首先开启处理机,然后打开并启动DataSink。在这个调用后,接收机器就可在媒体传送者上监听。<BR>停止传输者是非常简单的。以下代码将DataSink和Processor都停止和关闭掉:<BR><PRE class=overflow>public void stopTransmitting() throws IOException {<BR>dataSink.stop();<BR>dataSink.close();<BR>mediaProcessor.stop();<BR>mediaProcessor.close();<BR>}</PRE><BR><BR><STRONG>编译和运行MediaTransmitter</STRONG><BR>通过在命令行中输入javac
MediaTransmitter.java来编译例程序,可在你的工作目录中生成一个同名的.class文件。<BR>要运行例程序,在命令提示行中输入以下代码:<BR><PRE class=overflow>java MediaTransmitter rtpMediaLocator audioFile</PRE><BR><BR>此例将创建一个myAudio.mp3文件的媒体广播。不要忘记将rtpMediaLocator替换成一个媒体传输的RTP
URL,如同先前讨论的。<BR>你同样也需要将audioFile替换成你本机的音频文件名。<BR>所有的相对文件名都是相对于当前工作目录的。你会看见一些信息标志正在播放的文件。按下Enter键来停止播放。<BR><BR>为传送者的一个例命令行交互如下:<BR>java
MediaTransmitter rtp://192.168.1.255:49150/audio
myAudio.mp3<BR>如果初始编辑失败,确定JMF的jar文件包含CLASSPATH环境变量中。要近一步探索本程序和练习,请查阅MediaTransmitter源代码。<BR><BR><STRONG>接收传输的媒体</STRONG><BR>现在你可能会问,“如果没有人可以看或者收听的话,这个传播媒体有什么好的?”<BR>幸运的是,设定一个接收传播媒体的客户端只需要对我们在第二个例程序的MediaPlayerFrame源代码做很小的改动。<BR>MediaPlayerFrame类需要一个很小的调节来接收和播放音频文件。在main()方法中,你需要注释掉如下的一行:<BR><PRE class=overflow>mpf.setMediaLocator(new MediaLocator(new File(args[0]).toURL()));</PRE><BR>并且输入如下的一行:<BR><PRE class=overflow>mpf.setMediaLocator(new MediaLocator(args[0]));</PRE><BR>这个简单的改动允许我们通过String来创建一个MediaLocator对象,而不是通过创建一个File来创建MediaLocator。<BR>其他代码都一样。<BR><BR><STRONG>指定RTP
URL</STRONG><BR>在12页的说明编译和运行MediaPlayerFrame介绍了如何编译和运行MediaPlayerFrame例程序。这唯一的不同就是你需要为传输者指定RTP
URL。为接收者的例命令行交互如下:<BR><PRE class=overflow>java MediaPlayerFrame rtp://192.168.1.255:49150/audio</PRE><BR><BR><STRONG>运行网络媒体传送者的注意事项</STRONG><BR>如果你在网络上只有权使用一台机器,你仍然可以运行传输程序。当你启动传送程序的时候,你可以即使用RTP
URL传输地址,也可指定你工作的机器的机器地址。为了能够调节传输,在开始前接收者必须使用精确的同样的RTP
URL。<BR>如果你运行本例真实的网络版本,每台你使用的机器都需要安装JMF,不论是传输还是接收媒体流。这是必须的,因为不论是传送程序还是接收程序都大量的使用了JMF的API。<BR>在任一个案子中,确认在指定的RTP
URL中使用了相同的地址和端口;否则媒体传输是不会工作的。<BR><BR><STRONG><SPAN style="FONT-SIZE: 16px">第六节.
约束和资源</SPAN></STRONG><BR><STRONG>摘要</STRONG><BR>我希望本指南能给你提供如何使用JMF的API的有用的浏览。<BR>我们建立了三个小的应用程序来播放本地的音频和视频,也通过网络传播和接收媒体。这些应用程序的源代码中包含了很多的javadoc样式的注释。这就有助于你理解你剩余的问题。<BR>许多JMF的主题在本指南中并没有涉及。实际上,我们更关注JMF的基本概念和应用;在此基础上,我们能轻易地扩展学习的其他范围。要更深入JMF的应用程序,你可能想要学习下面的面板中所提到的主题。更近一步的阅读本指南中的主题,查阅23页的资源。<BR><BR><STRONG>高级主题</STRONG><BR>大量的值得做的练习在本指南的范围之上。在简单的说明之下自己更进一步的学习,你可以扩展我们的应用程序代码,也可以反展你的JMF相关知识。使用以下的练习开始:<BR>·
媒体捕获:JMF包含了丰富的API来捕获媒体数据。如果你对使用JMF捕获媒体感兴趣,你可以使用
javax.media.CaptureDeviceManager类和javax.media.protocol.CaptureDevice接口的
API来学习。对于一个高级的练习,考虑使用CaptureDeviceManager和CaptureDevice接口来增加媒体捕获功能到媒体播放应
用程序的GUI版本上。<BR>·
会话管理:由于本指南是一个JMF的说明,我们使输出表现非常的简单,仅仅实现了javax.media.DataSink输出。<BR>另
外的输出表示是使用javax.media.rtp.SessionManager。这个管理类允许客户端创建并监视他们的RTP流和连接。通过
SessionManager并随后创建流,它可能非常的接近监视RTP会话。作为一个高级的练习,转换我们的地三个演示程序来使用
SessionManager,然后监听流出的RTP流已经哪些客户端在收听。<BR>·
使用JMF的多点传送:我们的广播演示应用程序说明了如何传送一个网络的媒体到另外一个网络的一或多台机器上去。它也可能使用JMF中的多点传输协议来提供给更复杂,多用户的网络。<BR>JMF用户指南提供了一个使用JMF的多播协议的更深入的探讨。更进一步追踪本主题查看23页资源。<BR>·
传输视频:
我们的最后一个演示应用程序着眼于如何传输一个MP3音频文件,但是JMF也能够通过网络传递视频。关注API文档中的Format和ContentDescriptor类获得如何使用的更好的方法。<BR>·
导入/导出RTP媒体流:
JMF同样允许将RTP流保存为文件以便将来使用。举一个实例,一个远程电信会议可以保存下来以后再看。<BR>由于流已经保存再RTP格式中,已经不需要再次转换,这样可导致传输程序的性能改进。通过一个文件而不是URL来设置DataSink对象中输入/输出MediaLocator。你会再JMF用户指南中发现更深层次的主题探讨。<BR><BR><STRONG>资源</STRONG><BR>JMF<BR>·
下载mediaplayer.jar,本指南中使用的完整的例源代码。<BR>· JMF主页
(http://www.javasoft.com/jmf)是最好的探讨JMF更多信息的资源。<BR>·
你可以找到JMF说明书(http://java.sun.com/products/java-
media/jmf/2.1.1/specdownload.html),再Java开发者联盟上包括API文档和JMF用户指南。你必须有权使用所有的
这些资源,如果你想做任何更深入的JMF编程的话。<BR>· 官方的JMF支持文件格式
页面<BR>(http://java.sun.com/products/java-media/jmf/2.1.1/formats.html)
列出了所有可为JMF辨识并播放的文件格式。此文件格式页面也包括了学习更多关于捕获设备和RTP格式的参考。<BR>· MPEG-4 Video for JMF
(http://www.alphaworks.ibm.com/tech/mpeg-4), 来自IBM<BR>alphaWorks,
是一个JMF的视频编解码器。<BR>RTP<BR>· IETF RTP RFC
(http://www.ietf.org/rfc/rfc1889.txt) 非常详细的描述了RTP协议。<BR>· 查看 JMF API
Guide<BR>(http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html)
,有许多有关于RTP协议和描述以及它是如何在JMF上应用的。<BR>· 哥伦比亚大学有一个比较有用的RTP
FAQ(http://www.cs.columbia.edu/~hgs/rtp/faq.html).<BR>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)<BR>和 AWT
(http://java.sun.com/docs/books/tutorial/information/download.html#OLDui)
是非常好的能学习到很多关于Java程序语言中GUI编程的好地方。<BR>· 另外一个sun指南学习network programming
基础<BR>(http://java.sun.com/docs/books/tutorial/networking/index.html)。<BR>多点传输协议<BR>·
Explicit Multicast
(XCAST)<BR>(http://oss.software.ibm.com/developerworks/opensource/xcast/)
是IP多点传输的一种形式,为非常多的多点传输组设计提供可升级的支持,这些组有些少量的参与者代表。XCAST 代码得到了IBM Common Public
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -