基于JMF RTP的网络传输媒体流.doc_第1页
基于JMF RTP的网络传输媒体流.doc_第2页
基于JMF RTP的网络传输媒体流.doc_第3页
基于JMF RTP的网络传输媒体流.doc_第4页
基于JMF RTP的网络传输媒体流.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

基于JMF RTP的网络传输媒体流JMF中可以实现RTP媒体流的回放(playback)和传输(transmission),主要由javax.media.rtp, javax.media.rtp.event,和javax.media.rtp.rtcp包中定义的API完成。JMF可以通过标准的JMF plug-in机制来实现支持特定的RTP格式和动态负载。 你可以在本地播放RTP数据流,或将其存储到本地文件。同样,你可以通过JMF中RTP API实现传输捕获的或存储的媒体流到网上。RTP媒体流可以创建自一个本地文件或捕获自媒体采集设备。这些RTP媒体流同样可以在本地播放或存储。整体流程图示:1 RTP结构1.1 SessionManager在JMF架构中Session Manager对程序之间的会话进程进行控制和管理。Session Manager主要作用:明确每一个会话(session)中的所有参与者(participants)。管理每一个RTP会话。保存来自每一个发送或接收到的RTP和RTCP包中的统计信息。JMF RTP Session结构图:SessionManagr包含2个部分:Session Statistics和Session Streams。1.1.1Session Statistics统计量(Statistics)是记录基于每一条媒体流上的整个会话的统计信息。它包含:GobalReceptionStats:包含此会话的全局接收统计信息。GobalTransmissionStats:包含此会话的全局传输统计信息。RecetionStats:包含每一个参与者接收统计信息。TransmissionStats:包含每一个参与者的传输统计信息。1.1.2Session StreamsReceiveStream:表示一个接收到的来自远端参与者的媒体流。SendStream:表示一个来自本地的媒体流。1.2 RTP事件如下图所示,通过继承JMF中MediaEvent的类,可以创建响应的RTP事件。SessionListener:通过它得到一个会话状态的改变。NewParticipantEvent:表示一个新的参与者加入会话。LocalCollisionEvent:表示参与者请求的同步资源正在使用。SendStreamListener:通过它得到一个正在传送的RTP数据流状态的改变。NewSendStreamEvent:表示本地参与者已经创建一个新的发送数据流。ActiveSendStreamEvent:表示从DataSource创建的数据流已经开始发送。InactiveSendStreamEvent:表示从本地DataSource创建的数据流已经停止。LocalPayloadChangeEvent:表示数据流格式已经开始改变。StreamClosedEvent:表示数据流已经停止。ReceiveStreamListener:通过它得到一个正在接收的RTP数据流状态的改变。NewReceiveStreamEvent:表示SessionManager已经创建了一个从新的侦测到的地址传来的接收数据流。ActiveReceiveStreamEvent: 表示数据的传送已经开始。InactiveReceiveStreamEvent:表示数据的传送已经停止。TimeoutEvent:表示数据传送超时。RemotePayloadChangeEvent:表示接收到的数据流格式已经改变。ApplicationEvent:表示收到了一个RTCP App数据包。RemoteListener:通过它得到远端会话参与者的时间或RTP控制信息。ReceiverReportEvent:表示接收到一个RTCP的RR包。SenderReportEvent:表示收到一个RTCP的SR包。RemoteCollisionEvent:表示两个远端的参与者使用了相同的SSRC 出错。1.3与RTP事件相对应的RTCP类型表RTCP的控制类型和JMF事件类的一致性RTCP类型JMF中的事件类SRSendStreamEventRRReceiveStreamEventSDESSenderReportEventBYEByeEventAPPApplicationEvent:1.4数据传输格式在RTP传输中,如果还是用传统的AVI,MOV格式的话,将会增加服务器负荷,而且对网络要求特别高,因此需要将传统格式转化至易于传送,网络适应性好,抗丢包性能和抗误码性能好的编码格式。下表是JMF项目支持的视音频在RTP传送的压缩格式,也就是说经过定制后的输出视频流,还得进行一次转换,以便网络发送。表JMF支持的视音频在RTP传送中的格式多媒体类别RTP传输格式音频JAUDIO_G711_ULAW/rtp,dvi/rtp ,g723/rtp ,gsm/rtp视频jpeg/rtp,h261/rtp,h263/rtp转化格式的关键代码及其分析(视频):/从processor获得轨道控制器TrackControl tracks = processor.getTrackControls();/为每个轨道的格式进行转制for (int i = 0; i tracks.length; i+)/此处省略获得轨道信息格式和支持格式代码/下面一行为转制函数,需要参数为:轨道格式和轨道支持的格式chosen = checkForVideoSizes(tracksi.getFormat(), supported0);/此处省略如果不能对轨道格式转变代码/转制函数/* 在传输视频信息时,对于JPEG编码格式,视频图像的宽和高是8像素的整数倍,对于*H263编码格式,只支持三种图像的大小,即352X288,176X144,128X96像素,只要满*足了这些条件,才可以正常传输视频信息,所以,需要对视频格式进行转制,*不负荷条件的都需要转化,以满足正常传输。*/Format checkForVideoSizes(Format original, Format supported) int width, height;Dimension size = (VideoFormat)original).getSize();/获取视频图像的尺寸Format jpegFmt = new Format(VideoFormat.JPEG_RTP);Format h263Fmt = new Format(VideoFormat.H263_RTP);if (supported.matches(jpegFmt) /如果是JPEG格式/调整宽width = (size.width % 8 = 0 ? size.width :(int)(size.width / 8) * 8);/调整高height = (size.height % 8 = 0 ? size.height :(int)(size.height / 8) * 8); else if (supported.matches(h263Fmt) /如果是H263格式if (size.width 128) width = 128;height = 96; else if (size.width 176) width = 176;height = 144; else width = 352;height = 288; else /对于其他格式不受理return supported;return (new VideoFormat(null,new Dimension(width, height),Format.NOT_SPECIFIED,null,Format.NOT_SPECIFIED).intersects(supported);2RTP媒体数据流的传输与接收2.1 RTP媒体数据流的传输过程 上图为Transmit的整个设计架构,Processor处理来自Capture Device的数据后,输入对方IP和Port,将数据传送到网络上等待接收端接收,其中音频的端口为视频的端口加2。部分代码及分析:将转换格式后的数据放入一个DataSource/获得转制后的DataSourcedataOutput = processor.getDataOutput();/将DataSource转化为Push数据流PushBufferDataSource pbds = (PushBufferDataSource)dataOutput;/获取Push数据流PushBufferStream pbss = pbds.getStreams();数据源决定了轨道数的多少,如果数据源中包括视频和音频内容,则有两个轨道,一个轨道分给视频,一个轨道分给音频,在数据源的格式转制完成以后,每个轨道对应着一个RTP会话,这些RTP会话由会话管理器(RTPManager)统一管理。以下是建立RTP Session中发送的关键代码和分析:rtpMgrsi = RTPManager.newInstance();/RTP管理器实例化ipAddr = InetAddress.getByName(43);/获得目的地址的IP地址/获取本机IP地址localAddr = new SessionAddress( InetAddress.getLocalHost(),port);/获取目的机IP地址destAddr = new SessionAddress( ipAddr, port);/分别将本机和目的机IP地址加入至RTP会话管理器rtpMgrsi.initialize( localAddr);rtpMgrsi.addTarget( destAddr);/产生第N条轨道的传输流sendStream = rtpMgrsi.createSendStream(dataOutput, i);/传输流开始sendStream.start();2.2 RTP媒体数据流的接收过程 接收方式为经由SessionManager到DataSource到Player,然后播放。上图即为Receive的整个设计构架,传送端送出数据后,接收端输入对方IP然后等待接收数据,其中音频的端口为视频的端口加2。部分代码及分析:/*目的机建立RTP会话管理器原理和步骤基本与发送端一至,我们主要分析接收多媒体流的事件类。*/public synchronized void update( ReceiveStreamEvent evt)if(evt instanc

温馨提示

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

评论

0/150

提交评论