胡开明,陈建华
(广东松山职业技术学院计算机系,广东韶关512126)
对于一个基本的流媒体系统而言,它的基本目的是把流媒体传输到客户端,是一个典型的 S/C(Server/Client)架构[1].在过去几乎所有的S/C架构中,出现了一个不可避免的问题,就是在客户端数量过多的时候,出现了服务器端由于负载过重而导致系统性能急剧下降甚至崩溃.另一方面当前的流式媒体系统还存在以下的问题:(1)格式的不统一性.各大流式媒体传输系统的流式媒体格式之间相互差别很大,不能进行播放.(2)可扩展性差.不能使用扩展用户定义的接口,造成了流媒体系统开发上的分立局面.(3)平台的相关性.(4)目前的智能流技术只能静态的反映在客户端进行请求的时候网络的拥塞状况.在数据流开始传送的时候不能对网络状况进行反馈,也不能采取任何措施来适应这种网络状况的变化.使得流媒体传输过程中其QoS得不到保证[2].
为了解决这个问题,利用JAVA的JMF(Java Media Framework).利用其提供的多媒体功能加上对其原有接口的扩展,实现了一种基于JMF的RTP/RTCP传输模型的整体设计.在对RTP/RTCP工作模型的详细分析中,实现了一个动态的网络反馈机制,并利用其提供的动态的反馈信息实现了对发送端和接收端Buffer的控制,保证流媒体传输的QoS,以提高流媒体传输的效率.
JMF(Java Media Framework)是Sun公司提出的Java媒体架构[3].它是对应Java2平台标准版(J2SE)的一种可选用的应用编程接口 (API)软件.JMF的源代码将通过SCSL(Sun社团源代码许可模式)发布.这一强大的媒体工具包可以在任何版本 (1.1.x及以上版本)的Java平台上运行[4].
JMF2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能[5].JMF所提供多媒体功能如下:
(1)可以在Java Applet和应用程序中播放各种媒体文件.它提供了对对各种主要媒体形式和编码的支持,如 M-JPEG、H.263、MP3、Macromedias Flash、IBM 的 HotMedia和 Beatniks的 Rich Media Format(RMF)等.JMF2.1.1还支持多种媒体类型,如Quicktime MOV、Microsoft AVI和MPEG-1[6].
(2)可以播放从互联网上下载的流媒体.
(3)可以利用麦克风和摄像机一类的设备截取音频和视频,并保存成多媒体文件.
(4)处理多媒体文件,转换文件格式.
(5)向互联网上传音频和视频数据流.
(6)在互联网上广播音频和视频数据.
JMF架构中还包括了一个开放和统一的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件.
在对流媒体技术进行分析和研究以前,首先我们要明确整个流媒体的系统架构以及在流媒体架构中采用的各种技术,然后再对其进行进一步的探讨、改进和研究.一个典型的流媒体系统的功能模块如图1所示:
流媒体系统包括以下5个功能模块:
(1)信息采集和播放设备:信息采集设备负责将音视频信息源输入计算机.
(2)编码和解码工具:它由普通计算机和流媒体编码软件组成.视频采集设备,供编码软件处理;编码软件负责将流媒体采集卡传送过来的数字音视频信号压缩成流媒体格式.而解码工作与之相反,负责将媒体数字信号转化成终端可识别的信息.
(3)数据压缩模块:多媒体数据量巨大,为了适应其传输的网络环境,必须多于原来的多媒体数据进行高效的压缩,然后将压缩后的数据在网络上传递.其相应的解压模块将负责将数据还原成多媒体播放程序可以识别的信息.
(4)相关协议:流媒体数据由于自身的特点,在网络上传输时将采用和过去诸如文字,静态图像等不同的网络协议来进行传输.
(5)传输网络:一般来说,流媒体传输可以在现有任何网络上进行传输.更高的带宽将有利于流媒体传输效率的提高,也能够保证其质量.
流媒体采用流式传输方式在网络服务器与客户端之间进行传输.前面提到,流媒体可以进行用顺序流和实时流的方式进行传输.流式传输的实现需要合适的传输协议.IETF(Internet Engineering Task Force,因特网工程任务组)制订的很多协议可用于实现流媒体技术.目前,针对流媒体传输主要的工作在OSI七层中的网际层和传输层展开,当然也涉及到七层协议中的2.5层协议网络 (ATM、FR网络)[7].适合流媒体相关协议包括:
(1)RT P/RTCP协议:实时传输和实时传输控制协议;
(2)RSVP协议:资源预留协议;
(3)RTSP协议:实时流协议.
RTP协议是一种应用型的传输层协议,它并不提供任何传输可靠性的保证和流量的拥塞控制机制.RTP协议位于UDP协议之上,在功能上独立于下面的传输层 (UDP)和网络层,但不能单独作为一个层次存在,通常是利用低层的UDP协议对实时视音频数据进行组播 (Multicast)或单播 (Unicast),从而实现多点或单点视音频数据的传输.
RTP协议被设计成能够为某种特定的应用提供服务的一种协议.实际上,RTP协议的实现已经被融合到应用程序中来.RTP没有连接的概念,它既可以建立在面向连接的底层协议上,也可以建立在面向无连接的底层协议上,因此RTP协议对传输层是独立的.RTP协议一般由两个部分组成:数据报文部分(RTP报文)和控制报文部分 (RTCP).与传统的注重的高可靠的数据传输的运输层协议相比,RTP更加侧重的数据传输的实时性.此协议提供的服务包括时间载量标识、数据序列、时戳、传输控制等.RTP与辅助控制协议RTCP一起得到数据传输的一些相关的控制信息.其基本模型如下图所示:
图1 型的流媒体系统的功能
图2 RTP/RTCP基本工作模型
RealSystem的SureStream技术是实现流式媒体传输关键技术之一,可以根据不同连接速率创建多个文件和采用一种复杂客户/服务器机制探测带宽变化.但是,对于网络环境而言,网络的状况是不断变化的,SureStream技术显然没有能够对网络状况的变化进行任何的响应,即使网络状况发生变化,它对客户端发送的文件仍是在针对客户端请求时连接速率创建的.对于一个变化不大的网络而言,这种方法当然是行之有效的,但是对于一个不断变化的网络而言,建立动态的带宽侦测和反馈机制将是解决问题的有效途径.
利用RTCP的报告来侦测网络变化的趋势,根据网络变化的趋势,可以对系统其他部分进行调整.
首先,通过RR控制包获取反馈信息.即读取RTCP的RR(接收者报告)包并做统计分析,必须利用RTCP提供的3个性能指标来确定网络当前状况:
(1)传输时延抖动估计Interarrival jitter:记作J.传输时延抖动估计是指两个相邻数据包到达事件的平均偏差 (Mean Deviation)估算,若到达时间比较规律,则该值为零,否则该数值比较大.网络状况的变化并非毫无规律,在大体上,网络状况的变化只是一个状态到另外一个状态的转换过程.而Interarrival jitter必然体现这个状态的转换过程,即由0到非0再到0的所代表的稳定到变化再到稳定的过程.
(2)连续数据包传送的时延差值.记作D.RTCP定义的公式为:
其中Ri、Si分别代表第i个数据包接收和发送的RT P时间戳,因此Ri-Si就代表第i个数据包的相对发送时间,D(i,i-1)则代表相邻两个数据包的时延差.当D(i,i-1)不断增大时,我们可以得到结论,即网络可用带宽正在变小,反之变大.
根据这个变化趋势,可以在JMF平台上实现一个基于动态侦测带宽变化的智能流机制.
通过对RTP/RTCP的分析,已经了解了流媒体传输的整体协议模型,如图3所示.在这个模型的基础上,就可以建立自己的流媒体传输系统.
图3 流式媒体传输系统的整体协议模型
SessionManager接口定义了应用程序之间建立、参与一个会话和释放资源并退出整个会话的一整套方法.同样可以利用其来建立在 RTP传输中的 RT PSession.通过建立两个端口的Session对话,为RTP,RTCP建立了两个Port的连接.分别用来进行RTP的数据传送和RTCP的反馈和控制信息的传送.下面将利用JMF中的SessionManager来实现RTP Session:
(1)Session Statistics
通过SessionManager中的Session Statistics,可以保存每个会话的信息,即每个RTP/RTCP包的发送和接收信息.SessionManager保存了两个可以用来记录发送和接收信息包的属性:
GlobalReceptionStats:保存了会话中全局的接收信息.
GlobalTransmissionStats:保存了所有发送者的累计发送信息.
它们将被用来和RTCP包中的Sender'spacketcount等字段对应.
(2)Session Participants(会话参与者)
JMF的Session Manager能够记录一个会话中所有参与者的信息.每个参与者是通过一个类的实例(Instance)来确认的.该实例使用了会话中Participant接口.当SessionManager收到一个以前从未收到包含了SDES(Source Description)和CNAME的RTP数据包时,将创建一个Participant接口.参与者这是就可以加入一个会话.
在SessionManager中还有一个LocalParticipant属性,可以用来表示本地参与会话的Client或Server.本地参与者可以发送RTCP控制信息.
每个会话参与者可以由参于多个数据流,每个数据流将通过RTP中的SSRC来区分数据流的源.
(3)Session Streams
通过SessionManager,还为每个RTP数据流保持一个RTPStream对象.ManagerSession将RTP数据流分两类:ReceiveStream表示从远端参与者接收到的数据流.SendStream将表示通过Prosessor或者输入DataSource向网络发送的数据流.当SessionManager侦测到一个新的RTP数据包的时候,将自动建立一个 ReceiveStream.而如果要向外发送 RTP数据流,将调用SessionManager中的 createSend-Stream方法.
通过继承JMF中MediaEvent的类,可以创建响应的RT P事件.为了得到RTP事件,必须相应的RTPListener和SessionManager结合.
(1)SessionListener:通过它得到一个会话状态的改变.包括:
NewParticipantEvent:表示一个新的参与者加入会话.
LocalCollisionEvent:表示参与者请求的同步资源正在使用.
(2)SendStreamListener:通过它得到一个正在传送的RTP数据流的状态的改变.
NewSendStreamEvent:表示本地参与者已经创建一个新的发送数据流.
ActiveSendStreamEvent:表示从DataSource创建的数据流已经开始发送.
InactiveSendStreamEvent:表示从本地DataSource创建的数据流已经停止.
LocalPayloadChangeEvent:表示数据流格式已经开始改变.
StreamClosedEvent:表示数据流已经停止.Indicatesthatthestreamhasbeenclosed.
(3)ReceiveStreamListener:通过它得到一个正在接收的RTP数据流的状态的改变.
New ReceiveStreamEvent:表示SessionManager已经创建了一个从新侦测到的地址来的接收数据流.
InactiveReceiveStreamEvent:表示数据的传送已经停止.
TimeoutEvent:表示数据传送超时.
RemotePayloadChangeEvent:表示接收到的数据流格式已经改变.
ApplicationEvent:表示收到了一个RTCPApp数据包.
(4)RemoteListener:通过它得到远端会话参与者的时间或RTP控制信息.
ReceiverReportEvent:表示接受到一个RTCP的RR包.
SenderReportEvent:表示收到RTCP的SR包.
RemoteCollisionEvent:表示两个远端的参与者使用了相同的SSRC,出错.
JMF架构中的SessionManager同样提供了对会话的控制功能.SessionManager中的控制功能是继承了JMF中的Control.这样,通过GetControls方法,就可以的到例如BufferControl的接口.
无论对于Stream Server还是Client而言,对于一个发起的流媒体传输会话,都会在系统资源中占用一定的Buffer资源.一般来说,一个Session的Buffer是固定不便的.JMF的会话控制提供了对Buffer的控制能力.同时,JMF对RTP/RTCP协议的支持使得能够获得RTCP包中包含的信息.在上面对RTCP协议进行分析的时候,已经得到了一个基于RTCP报告、可获取对网络状况变化趋势的反馈机制,使得能够根据网络状况,改变相应Session的Buffer大小,使其适应当前网络的状况.实现智能流,其模型如图4所示.
通过对JMF架构的系统分析和对SessionManager等接口的扩展,可以用JMF架构实现基于RTP数据流的传输.可以利用SessionManager对一个会话的创建和控制来进行网络流媒体的传输.数据将从DataSource获取.例如,为了传送实时捕捉的数据.可以按如下步骤进行:
(1)为该会话创建并初始化一个SessionManager.
(2)构建一个处理器 (Processor),它将使用相应的DataSource,这个DataSource将是由捕捉设备输入的.
(3)将输出格式定义为RTP格式,并加入相应的RTP解码.
(4)从Processor得到输出DataSource.
(5)调用SessionManager的CreateSendStream方法发送输出DataSource中的数据.
(6)不断获取RTCP报告信息,对 Buffer大小控制,以保证传输效率.
可以通过SendStream中的 Start和Stop方法来对数据的发送进行控制.当第一次开始发送数据时,SessionManager将充当一个接受者的角色 (发送RTCP的 RR数据包).一旦创建了 SendStream.将发送RTCP的SR数据包,并在数据流传送期间以致充当一个发送者的角色.当所有数据包发送完毕,可以关闭该SessionManager.
在接收方要做的工作是同样的,用SessionManager来创建一个RTP会话以接收数据包并交换控制信息.并创建接收 Data-Source,同时创建一个Player对接受中的 Data-Source.
图4 JMF架构上的基于RTCP报告的智能流模型
图5 基于JMC的RTP/RTCP传输模型的设计
通过在分析 RTP/RTCP协议时得出的反馈机制的方向,实现一种基于JMF的RTP/RTCP传输模型的整体设计.在对RTP/RTCP工作模型的详细分析中,实现了一个动态的网络反馈机制,并利用其提供的动态的反馈信息实现了对发送端和接收端Buffer的控制,保证流媒体传输的QoS,以提高流媒体传输的效率.
[1] 董晓捷.流媒体应用技术浅谈[J].河北北方学院学报:自然科学版,2007,(04):50-53
[2] 王锐,郭喜凤.基于遗传算法的DSR路由协议的优化[J].河北北方学院学报:自然科学版,2008,(01):59-62
[3] 胡泽,赵新梅.流媒体技术与应用[M].北京:中国广播电视出版社,2006:145-147
[4] 庄捷.流媒体原理与应用[M].北京:中国广播电视出版社,2007:98-100
[5] 肖磊,陈卓.流媒体技术与应用完全手册[M].重庆:重庆大学出版社,2003:201-304
[6] 梁振军.计算机网络通信与协议[M].北京:石油工业出版社,1990:135-136
[7] 彭波,孙一林.Java多媒体技术[M].北京:清华大学出版社,2004:187-189