基于JMF的跨平台视频点播系统的设计与实现
作者 : 未知

  摘要:利用Java媒体框架(JMF)开发的视频点播系统具有开发简单、跨平台、提供QoS保证和交互性好等优点,具有广泛的应用前景。介绍了JMF应用编程接口的特点和结构,阐述了基于JMF开发的跨平台的视频点播系统的整体结构设计,并详细介绍了基于RTP的实时媒体传输、基于RTCP的拥塞控制、完整VCR操作和穿越NAT等关键技术的具体实现。
  关键词:Java媒体框架;视频点播;实时传输协议
  中图分类号:TP393文献标志码:A
  文章编号:1001-3695(2007)04-0235-04
  
  0引言��
  
  随着网络带宽的拓宽和计算机技术的发展,以视频点播为代表的实时流媒体业务得到了飞速的发展。视频点播业务以丰富的内容、自主的点播形式等特点受到了广大网络用户的欢迎。但是,现今市场上的视频点播系统还有许多缺点:①不支持跨平台应用部署。通常的系统服务器端为Linux,客户端为Windows,如需要改变其部署操作系统,则需要重新开发。②直接采用UDP或TCP进行流媒体数据的传输,没有一定的QoS保证。③VCR操作简单,不支持穿越NAT等。��
  Java语言具有跨平台可移植性,在网络上应用广泛而且灵活。Sun公司推出的Java语言的媒体软件开发包JMF(Java Media Framework,Java媒体框架[1])使得流媒体应用开发变得简单。基于JMF的优点,笔者设计开发了一个跨平台的视频点播系统,这个系统具有开发简单、成本低;跨平台、可移植性好;采用实时传输协议[2](RTP/RTCP)进行流媒体数据传输,服务质量(QoS)有保证;提供完整的VCR控制操作,交互性好;支持穿越NAT等优点。��
  
  1JMF介绍��
  
  JMF是一个把音频、视频及其他基于时间的媒体结合到Java程序和Applet中的应用程序接口。它使得Java程序可以支持以下功能:捕捉和存储媒体数据,控制回放时执行的处理类型,进行媒体数据流的个性化处理。而且,最新版本的JMF还支持用户利用插件应用程序接口(Plug��in API)自定义和扩展JMF的功能。JMF不仅支持本地媒体文件、媒体设备的采集、处理、存储、播放等功能,还支持基于网络的压缩媒体流的同步、控制、处理和播放。所谓媒体流,指的是可以边下载边播放的媒体传输方式。��
  JMF包括JMF API和JMF RTP API两个部分。前者的主要功能是捕捉、处理、存储和播放媒体;后者主要是在网络上传输和接收媒体流。��
  
  1.1JMF API的特点与结构��
  JMF API支持媒体捕捉并能够满足应用程序开发人员对媒体处理和播放进行控制的需要。JMF API还提供了一个可以直接访问处理底层媒体数据的插件架构,使得JMF可以很容易地被扩展。它的特点有:易于编程;支持捕捉媒体数据;使Java可以开发媒体流传输和媒体会议等应用;使得高级开发人员和技术供应商能够在已存在的API基础上实现自定义解决方案,并能够方便地在已存在的框架中集成新的特征;提供对原始的媒体数据的存取等。通过利用Java平台的优势,JMF保持了“Write once,run anywhere”的承诺,为访问底层的媒体框架提供了一个通用的跨平台Java API。��
  JMF为基于时间的媒体数据的获取、处理和传送提供了一个统一的框架和消息协议,它可以支持大部分标准的媒体类型。JMF API的结构主要由以下几部分组成:捕捉设备、数据源、播放器和处理器等。数据源类似于磁带,封装了捕捉设备或者媒体文件获取的媒体流;播放器类似于录像机,将数据源中的数据播放出来,输出到显示器、声卡等设备;而处理器类似于转录机,将数据源中的数据经过某些处理后得到另一个数据源。以上的这些部分都是以接口的形式出现,JMF通过使用被称为Manager(管理器)的中间对象来创建适应不同应用要求的接口。��
  数据源和播放器是JMF中用来管理捕捉、表现和处理基于时间的媒体的高层API。JMF还提供用于集成用户化的处理组件和扩展应用的低层API,用于扩展编解码器、复用/解复用器等。��
  1.2JMF RTP API的特点与结构��
  JMF RTP API提供了对实时传输协议RTP的支持。RTP是一种应用型的传输层协议,用于Internet上针对多媒体数据流的传输。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息并实现流同步。RTP协议位于UDP之上,本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,这些功能由RTCP来完成。RTP和RTCP配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。JMF对RTP的支持使用户开发基于流媒体实时传输的应用,如视频点播、视频会议、在线直播等,变得更为简单。��
  JMF使用SessionManager(会话管理器)来建立和管理用于传输实时流媒体的RTP会话。会话管理器跟踪会话的参与者和被传输的流,从本地参与者的角度维护会话状态。将JMF框架和RTP结合就形成了如图1所示的JMF RTP总体结构。��
  
  2系统结构设计��
  
  系统可分为四个部分,即Web服务器、流媒体服务器、IP网络和客户机。整个视频点播系统的结构如图2所示。各个部分的功能如下:��
  (1)控制服务器。它由节目信息管理模块、用户信息管理模块和认证计费模块三个模块组成,负责系统数据传输以外的其他控制功能,主要功能都是基于Web服务器实现。节目信息管理模块负责节目信息的配置,并将配置好的节目信息发布到Web上,供用户点播;用户信息管理模块负责用户信息的维护;认证计费模块负责用户的注册、登录、点播记录,并根据点播情况和计费策略生成点播费用清单。��
  (2)视频服务器。它由RTSP服务器和数据泵两部分组成,负责点播连接的建立、数据的传输及控制,主要功能都是基于Java和JMF实现。RTSP服务器负责接收处理各种RTSP请求,实现点播连接的建立、释放和各种VCR控制操作;数据泵负责流媒体数据传输。��
  (3)IP网络。它既可以是宽带局域网,也可以是国际互联网。为支持流媒体的实时传输,IP网络需要保证足够的带宽。��
  (4)客户机。它由浏览器、数据接收器和RTSP请求发生器三部分组成,负责流媒体数据的接收和回放、用户与服务器的交互,主要是基于Java Web技术和JMF流媒体接收、播放技术实现。浏览器负责用户与控制服务器交互;数据接收器负责流媒体数据的接收、缓冲及回放,还要实现基于RTCP的拥塞控制信息反馈;RTSP请求发生器负责与RTSP服务器交互,实现点播请求的发送、VCR控制信令的发送等。��
  点播进行过程可以描述如下:用户通过客户机的浏览器登录系统,选择节目并通过RTSP请求发生器发送点播请求。RTSP服务器接收处理点播请求,选择流媒体服务器,定位媒体文件。数据泵从磁盘阵列上的媒体文件或者音视频采集设备等多种媒体源获取媒体流,经过特定编码处理后建立RTP会话,以RTP/RTCP将媒体数据传输给客户机。客户机从网络上接收RTP数据,边接收边播放,同时不停地发送RTCP反馈信息。在点播的过程中,用户可以通过RTSP请求发生器来进行各种VCR控制操作。��
  系统的实现和运行表明,采用控制信息和数据处理的分开数据传输和传输控制的分开,能够降低系统实现的复杂度,采用模块化的实现方法可以提高实现效率,简化系统的调试和维护。客户机和服务器之间采用标准的协议(RTSP、RTP/RTCP、HTTP)进行交互,降低了两者的耦合程度,有利于对某一方面进行改进的时候不会对另一方造成影响。��
  
  3关键技术及实现��
  
  视频点播系统的技术指标包括音视频的回放质量和连续性、传输的实时性、友好灵活的交互性、对各种网络环境和网络变化情况的自适应性等。要实现这些指标,基于RTP的实时媒体流传输[3]、基于RTCP的拥塞控制[4]、完整VCR控制、穿越NAT[6]等技术是关键的技术。��
  
  3.1基于RTP的实时流媒体传输��
  基于JMF对媒体流和实时传输协议RTP的支持,采用JMF可以很方便地实现基于RTP/RTCP的实时媒体流传输。传输的建立过程可以分为以下两部分。��
  (1)创建并配置处理器对象,产生数据源��
  处理器(Processor)对象是用来设置和控制从媒体源读取媒体数据的。媒体源可以是媒体文件也可以是音视频采集设备,这里以媒体文件为例。创建处理器对象的方法是:新建以媒体文件路径为参数的MediaLocator对象,以此对象为参数调用Manager(管理器)对象的createProcessor方法。��
  配置处理器对象首先要对处理器对象的通道(Track)设置参数。方法是:调用处理器对象的getTrackControls方法,得到通道的TrackControl对象,然后调用TrackControl对象的setFormat方法设置处理后的媒体格式(即适合于RTP传输的媒体编码格式)。对于音频,JMF提供五种编码格式,即ULAW/RTP、G723/RTP、GSM/RTP、DVI/RTP和MPEGAudio/RTP;对于视频,JMF提供四种编码格式,即JPEG/RTP、MPEG/RTP、H261/RTP和H263/RTP。采用哪种编码格式依赖于媒体文件存储时的压缩编码格式,如以XVID、MP3压缩的MPEG4媒体文件可以采用H263/RTP、MPEGAudio/RTP编码格式进行传输。��
  配置处理器对象还要设置处理器对象的数据输出格式,方法是调用处理器对象的setContentDescriptor设置。可设置的数据输出格式有CONTENT_UNKNOWN、RAW、MIXED、RAW_RTP;一般采用默认值RAW即可。例如编码格式为JPEG/RTP,还可以通过调用JPEG编码格式的QualityControl对象的setQuality(float newQuality)方法设置图像质量,一般设置为0.5。处理器对象配置完成后就可以调用getDataOutput方法获取数据源,以供下一步使用。��
  (2)创建传输器,进行RTP数据流传输��
  JMF中传输RTP数据流有两种方法:①使用数据接收器(DataSink)进行数据流传输;②使用会话管理器(Session��Manager)创建输出数据流并控制传输的进行。��
  使用数据接收器进行传输是比较简单的方法,只需要创建一个数据接收器对象,然后调用此对象的open()、start()方法来开启传输,调用stop()方法来停止传输。但是,使用数据接收器进行传输只能传输一个数据流,而且无法监控会话状态。在本系统中,一般传输的媒体文件均包括音频、视频两个数据流,而且利用RTCP进行传输拥塞控制时需要监控会话状态,所以无法使用数据接收器来进行传输。这时候就需要使用会话管理器创建多个输出数据流来进行传输。��
  使用会话管理器传输音视频RTP数据流的方法如下:��
  (1)创建一个会话管理器对象(实例化一个RTPSessionMgr对象);��
  (2)调用initSession方法初始化会话管理器;��
  (3)调用startSession方法开启会话管理器;��
  (4)调用createSendStream方法创建输出流对象;��
  (5)调用输出流对象的start()方法开始RTP数据流的传输。��
  
  3.2基于RTCP的拥塞控制��
  Internet是不能提供带宽保证的网络,很容易发生拥塞。而且Internet接入用户的网络情况带宽都不太一样,发生拥塞的情况也不一样。如果以单一的传输速率进行传输,对于连接速率低于设定的传输速率的用户,将会出现频繁缓冲的现象;而对于连接速率高于传输速率的用户来说,浪费了部分带宽,接收的效果并没有达到最好。为了实现Internet视频点播系统的应用级QoS保证,可以根据RTCP反馈的传输统计信息,动态地对RTP传输速率进行调整,以适应网络带宽的变化,提高音视频的传输质量。��
  判断网络拥塞有不同的策略,这里主要根据某段时间内的丢包率的大小作为标准来判断。自适应流媒体传输控制策略分为三个步骤:��
  (1) RTCP分析。根据接收包RR的反馈信息得出包丢失率等参数。��
  (2) 网络状况分析。根据包丢失率的大小分析出网络拥塞状况。��
  (3) 带宽调整。根据网络拥塞状况调整流媒体数据的发送速率。��
  本系统采用AIMD(加性增、乘性减)算法对传输速率进行动态调整。具体算法如下所示:��
  其中,p是丢包率;R是传输速率;Pc是网络拥塞临界值;Pu是网络轻载临界值;MaxR是允许的最大发送速率;MinR是允许的最小发送速率;AIR是速率线性增量;i是乘性减小因子。输入参数丢包率p既可以是原始值,也可以是平滑值,使用平滑值可以减少抖动。本系统使用一个低通滤波器对丢包率p进行平滑处理:p=(1-a)p+ab。其中b为RR包中的丢包率;a是滤波调整参数,0  丢包率p的计算方法如下:调用输出流对象的getSenderReport()方法得到接收端报告,调用getSenderPacketCount()方法得到接收到的包数pLost;调用输出流对象的getSourceTransmissionStats()得到传输状态,再调用getPDUTransmitted()方法得到已发送的包数pSent。因此,p=(pSent-pLost)/pSent。速率调整可以通过调用输出流对象的setBitRate方法实现。��
  
  3.3完整VCR控制��
  基于用户对视频流控制的程度可以将VOD系统分为两种:①TVOD(True VOD)系统中,用户可以完全控制视频节目的播放,进行各种VCR控制操作,如暂停、播放、快进、快退以及随机定位节目播放位置;②NVOD(Near VOD)系统中,用户只能对节目播放有部分的控制能力。本文实现的是支持完整VCR控制操作的TVOD。��
  在某些直接使用TCP、UDP或HTTP传输媒体文件数据的TVOD中,只能通过改变VOD服务程序数据发送状态和发送内容来实现简单的VCR操作,如暂停、播放、拖动等。因为不对媒体文件编码格式进行处理,所以无法实现快进、快退等更深层次的VCR操作。JMF中流媒体服务程序分为处理器和传输器两个部分,在处理器部分对媒体文件的编码格式、编码内容进行了处理,只需要对处理器作相应的控制,就可以很方便地实现快进、快退等深层次的VCR操作。具体的各种VCR控制操作的软件实现如下:��