JMF

 

第八章 理解JMF RTP API

JMF可以通过定义在javax.media.rtp,javax.media.rtp.eventjavax.media.rtp.rtcp包中的API来回放和传输RTP流。JMF可通过标准JMF插件机制扩展到支持额外RTP相关的格式以及动态载荷。

注意:JMF兼容实现不是必须支持javax.media.rtp,javax.media.rtp.event,以及javax.media.rtp.rtcp中的RTP APIJMF的参考实现由Sun Microsystems,Inc提供,IBM公司全面支持这些API

你可以在本地播放接入的RTP流,将他们存入一个文件,或两者同时进行。

举个例子,RTP API可被用来实现一个像一个具有答录机一样应答呼叫和录制消息功能的电话应用程序。

与此类似,你可以使用RTP API来在网络上传输被捕捉或存储的媒体流。外出的RTP流可以由一个文件或一个捕捉设备组织。外出的流也可以被本地播放,存为文件,或两者同时进行。

举例来讲,你可以实现一个捕捉现场音频和视频的应用程序,然后为每个媒体类型使用一个单独的RTP会话,并将他们送到网络上。

类似地,你可以在一个会议应用程序中录制会议内容作为将来的广播用途,或使用一个预先录制好的音频流作为保留音乐

RTP框架

JMF RTP API被设计用于与JMF的捕捉、表现与处理能力无缝协同工作。播放器与处理器被用来以跟其他任何媒体内容相同的表现和操控方式来处理RTP媒体流。你可以传送被一个使用capture DataSource的本地捕捉设备捕捉到的媒体流或是被一个DataSink存在一个文件里的媒体流。类似的,JMF可以通过标准插件机制扩展来支持额外的RTP格式以及载荷。

会话管理器

JMF中,一个SessionManager被用作协调一个RTP会话。该会话管理器保持会话接收者与被传输的流。

会话管理器维持会话的状态,会话状态像正被本地的参与者观看一样。这样产生的效果是,一个会话管理器是一个分布实体(RTP会话)的本地表现。会话管理器也操纵RTCP控制通道,并且同时为RTCP发送者与接收者提供支持。

SessionManager接口定义了可以让一个应用程序初始化、开始参与会话、移除被应用创建的独立流以及关闭整个会话的方法。

会话统计

会话管理器维持所有在会话中发送与接收的RTPRTCP包的统计信息。统计信息在整个会话过程被跟踪,每个流有一个统计信息。会话管理器提供了对全局接收和传输统计信息的访问。

· GlobalReceptionStats:维持该会话中的全局接收统计信息。

· GlobalTransmissionStats: 维持本地所有发送者的累计传输统计信息。特定接收与输出流统计信息可从该流中得到。

· ReceptionStats:为一个独立参与者维持源的接收统计信息。

· TransmissionStats: 为一个独立发送流维持传输统计信息。

会话参与者

会话管理器跟踪一个会话中的所有参与者。每个参与者用一个实现了Participant接口的类的实例来表现。会话管理器在每个同时包含有一个源描述(SDES)以及一个在该会话中从来未出现过(或从最后使用时算起已经超时)的规范名(CNAME)的RTCP包到达时,创建一个参与者。参与者可以是被动的(只传输控制包)和主动的(在传输控制包时也发送一个或多个RTP数据流)。

表示本地客户端/服务器参与关系的本地参与者只能有一个。一个本地参与者代表其将通过启动一个会话开始发送RTCP控制信息或数据,以及维持到达数据以及控制信息的状态。

一个参与者可以拥有多个流,通过这些流的起源所用的同步源标识符(SSRC)对它们进行区别。

会话流

会话管理器为会话中的每个RTP包流维持一个RTPStream对象。有两种类型的RTP流:

1ReceiveStream表现从一个远程参与者接收到的流。

2SendStream表现一个来自Processor或在网络上被发送的输入DataSource流。

一个ReceiveStream在一个会话管理器探测到一个新RTP数据源时自动创建。要创建一个新的SendStream,要调用SessionManager.createSendStream()方法。

RTP事件

几个RTP特有事件定义在javax.media.rtp.event内。这些事件被用来报告RTP会话与流的状态。

要接收RTP事件通知,你要实现相应的RTP监听器并用会话管理器对其进行注册。

·SessionListener:接收会话状态变化的通知。

·SendStreamListener:接收被传输的RTP流的状态变化的通知。

·ReceiveStreamListener:接收被接收的RTP流的状态变化的通知。

·RemoteListener:接收从一个远程参与者接收到的事件或RTP控制消息。

会话监听器

你可以实现SessionListener来接收属于RTP会话整体的事件,如新参与者的加入事件。

有两种session范围的事件类型:

·NewParticipantEvent:指新参与者已经加入到会话。

·LocalCollisionEvent:指该参与者的同步源已经被占用。

发送流监听器

你可实现SendStreamListener来在下列情况下接收通知:

·新的发送流被本地参与者创建

·用于创建发送流的DataSource数据传输动作的起停。

·发送流的格式或载荷类型改变。

5种事件与一个SendStream相关:

·NewSendStreamEvent:表示新的发送流被本地参与者创建。

·ActiveSendStreamEvent:表示从用来创建发送流的DataSource的数据传输已经开始。

·InactiveSendStreamEvent:表示用来创建发送流的DataSource的数据传输已经停止。

·LocalPayloadChangeEvent:表示流的格式或载荷已经改变。

·StreamClosedEvent:表示流已经被关闭。

接收流监听器

你可以实现ReciveStreamListener,以在下列情况出现时接收事件通知:

·新接收流被创建。

·数据传输启动或停止。

·数据传输超时。

·先前孤立的ReceiveStream已被关联到一个参与者。

·一个RTCP APP包被接收。

·接收流的格式与载荷类型改变。

你也可以使用该接口来取得流的句柄以及访RTP DataSource,以创建一个MediaHandler

有七种与ReceiveStream有关的事件类型:

·NewReceiveStreamEvent:表示会话管理器为一个新探测到的源创建了一个新的接收流。

·ActiveReceiveStreamEvent:表示数据传输已经开始。

·InactiveReceiveStreamEvent:表示数据传输已经终止。

·TimeoutEvent:表示数据传输已超时。

·RemotePayloadChangeEvent:表示接收流的格式或载荷已经改变。

·StreamMappedEvent:表示一个原先孤立的接收流已被关联到一个参与者。

·ApplicationEvent:表示一个RTCP APP包已被接收。

远程监听器

你可以实现RemoteListener来接收来自一个远程参与者的事件通知或RTP控制消息。你也许想要在一个用来监视会话的应用中实现RemoteListener——它使你可以不用在每个流中接收数据或信息,而直接接收RTCP报告和监视会话接收质量。

3种事件类型与一个远程接收者相关联:

·ReceiverReportEvent:表示一个RTP接收者报告被接收。

·SenderReportEvent:表示一个RTP发送者报告被接收。

·RemoteCollisionEvent:表示两个远程参与者同时使用了相同的同步源IDSSRC)。

RTP数据

RTP会话中的流用RTPStream对象表示。有两种RTPStream类型:ReceiveStreamSendStream。每个RTPStream拥有一个相关的缓冲数据源。对于ReceiveStream,该数据源总是一个PushBufferDataSource

当会话管理器探测到额外的来自远程参与者的流到达时,会自动创建新的接收流。通过在会话管理器上调用createSendStream()方法来创建新的发送流。

数据处理器

JMF RTP API被设计成独立的传输协议。可创建一个自定义的RTP数据处理器以使JMF工作在一个特定的传输协议之上。数据处理器是一个可被播放器用作媒体源的DataSource

RTPPushDataSouce抽象类定义了JMF RTP数据处理器的基本元素。一个数据处理器同时拥有一个输入数据流(PushSourceStream)和一个输出数据流(OutputDataStream)。数据处理器可被用作一个RTP会话的数据通道或控制通道。若被用作数据通道,该数据处理器需要实现DataChannel接口。

一个RTPSocket是一个同时具有一个数据和控制通道的RTPPushDataSource。每个通道具有一个输入和输出流用来流化数据到/从底层网络。一个RTPSocket可以输出RTPControls来加入动态载荷信息到会话管理器。

因为一个自定义RTPSocket可通过Manager类来创建一个播放器,JMF定义了自定义RTPSocket实现的名称和位置:

<协议包前缀>.media.protocal.rtpraw.DataSource

RTP 数据格式

所有RTP特有数据使用一个被定义在AudioFormatVideoFormat类中的RTP特定格式编码。举个例子,被gsm RTP包装的包,其编码被设置为AudioFormat.GSM_RTP,jpeg编码后的视频格式,编码则被设置为VidioFormat.JPEG_RTP

AudioFormat定义了4种标准的RTP特定编码字符串:

public static final String ULAW_RTP = "JAUDIO_G711_ULAW/rtp";

public static final String DVI_RTP = "dvi/rtp";

public static final String G723_RTP = "g723/rtp";

public static final String GSM_RTP = "gsm/rtp";

VideoFormat定义了3种标准RTP特定编码字符串:

public static final String JPEG_RTP = "jpeg/rtp";

public static final String H261_RTP = "h261/rtp";

public static final String H263_RTP = "h263/rtp";

 

RTP控制

RTP API定义了一个RTP特定控制,RTPControl。典型地,RTPControlRTP特定DataSources实现。它提供一个机制来在一个动态载荷和一个Format之间加入一个映射。RTPControl也提供了存取会话统计,以及得到当前载荷格式的方法。

SessionManager扩展了Controls接口,使一个会话管理器可以通过getControl()getControls()方法输出更多的Controls。举个例子,会话管理器可以输出一个BufferControl来让你指定缓冲长度和临界点。

接收

到达的RTP流的表现由播放器进行操纵。要从一个RTP会话接收和表现一个单独的流,可以用一个描述该会话的MediaLocator来创建一个播放器。一个用于RTP会话的媒体定位器(media locator)是如下格式:

rtp://address:port[:ssrc]/content-type/[ttl]

播放器被创建并连接至会话中第一个流。

若在会话中有多个流要表现,你需要使用一个会话管理器。你可以在一个流被加入到该会话和时通过会话管理器接收通知,然后为每个新流创建一个播放器。使用一个会话管理器也能让你直接监视和控制该会话。

传输

一个会话管理器可以被用来初始化并控制一个会话,以使你能在网络上流化数据。这些被流化的数据通过一个Processor得到。

举个例子,要创建一个发送流来传输来自现场捕捉源的数据,你应该:

1、为该会话创建、初始化,并启动一个SessionManager

2、使用合适的capture DataSource以创建一个Processor

3、将该Processor的输出格式设为一个RTP相关的格式。一个与你想要传输的数据格式相应的RTP包装器codec必须可用。

4、从Processor检索输出DataSource

5、调用会话管理器的createSendStream然后将DataSource传入。

通过SendStreamstartstop方法来控制传输。

当第一次启动时,SessionManager的行为类似接收者(送出RTCP接收者报告)。一旦SendStream被创建,且有一个或多个发送流存在,它行为就马上变为发送者主机,开始送出RTCP发送者报告。若所有SendStream都被关闭(不是仅仅被停止),则会话管理器恢复为一个被动接收者。

扩展性

JMF的其它部分一样,RTP能力可以被增强与扩展。RTP API支持一个基本的RTP格式和载荷集。高级开发者及技术提供者可以实现JMF插件来支持动态载荷及额外的RTP格式。

实现自定义包装器和解包器

要实现一个自定义包装器或解包器,你可以实现JMF Codec接口

http://hbyw618.bokee.com/tb.b?diaryId=11118768

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个基于Spring框架的开发框架,它可以使开发人员更加快速、便捷地开发Web应用程序。而JMF是一个Java库,它为Java应用程序提供音频、视频和其他媒体功能。下面是在Spring Boot中集成JMF的基本步骤: 1. 下载和安装JMF - 首先,您需要从Oracle官方网站下载JMF。安装JMF后,您可以在Java安装目录下找到JMF的库文件。 2. 配置JMF - 为了使JMF正常工作,您需要将JMF库文件添加到您的Java类路径中。您可以通过在系统环境变量中设置JMF_HOME变量或添加JMF库文件路径到Java类路径中来完成此操作。 3. 添加JMF依赖 - 在Spring Boot应用程序中,您需要将JMF库文件添加到您的项目依赖中。您可以使用Maven或Gradle等构建工具来管理您的依赖。 4. 编写代码 - 在Spring Boot应用程序中,您可以使用JMF提供的类和接口来实现音频、视频和媒体功能。您可以在Spring Boot应用程序中编写代码来使用JMF,就像在普通Java应用程序中一样。 以下是一个使用JMF播放音频文件的Spring Boot示例: ``` import javax.media.*; import java.net.*; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class JMFDemoApplication { public static void main(String[] args) { SpringApplication.run(JMFDemoApplication.class, args); playAudio(); } public static void playAudio() { try { // 创建一个播放器 Player player = Manager.createPlayer(new URL("file:///C:/audio.wav")); // 开始播放 player.start(); // 等待播放结束 player.waitToEnd(); } catch (Exception ex) { ex.printStackTrace(); } } } ``` 在这个示例中,我们将JMF库文件添加到项目依赖中,并在Spring Boot应用程序的main方法中调用playAudio方法来播放一个名为audio.wav的音频文件。您可以使用其他JMF类和接口来实现其他音频、视频和媒体功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值