基于JMF的远程监控技术的实现
2009-02-05
作者:陈希
引 言
随着网络技术的发展,网络事业的不断扩大,远程监控技术的使用越来越频繁。远程监控即远程截获屏幕图像传输。此技术大多用于网络管理软件等远程控制软件上。此技术的应用使得客户端能够对服务端进行远程的监控。
然而,现在普遍的远程监控软件只是从服务端传送一张屏幕的图片,只能观察到截取屏幕时屏幕一瞬间的情况,并不是一种实时的远程监控,而本例中所实现的远程监控技术是一种实时的远程监控技术。
由于JMF是一种独立的多媒体框架,它的特点使得本实例中的实现的远程监控与一般的实现方法是不完全相同的,在功能上也要比传统的强大很多,下面将详细介绍如何实现基于JMF下的远程监控技术。
概 述
JMF即Java Media Frame,是基于java的多媒体框架,JMF为 java提供了一种抽象机制,向开发者隐藏了实现的细节,开发者利用它提供的借口可以方便的实现强大的功能。
在JMF中,使用RTP协议来接收和传输多媒体数据的,RTP是一种针对多媒体的一对一或一对多的传输协议,RTP会话将多媒体数据分作一系列的数据报来传输,这些从特定的数据源发出的数据包就组成了RTP数据流,这种多媒体数据流是一种实时数据流,即当客户端以实时流的形式接收媒体数据时,它可以不用等待所有的数据接收完毕,就可以开始播放,这是实时流的最大优点。而本例中也用到了这一优点来实现该技术。
实现描述
由于是远程监控,即程序要分为两部分,一部分是服务端(Server) ,另一部分是客户端(Client)。服务端负责截获屏幕图像,并传输媒体数据 。客户端负责控制服务端并接收和播放媒体数据。
客户端与服务端的连接是由套接字(Socket)连接和RTP连接来实现的。
套接字连接负责传输通讯信息及图片数据,例如:RTP会话端口,媒体格式,图片起点位置,高度宽度等。实现远程通知服务端开始或停止截屏等功能。服务端套接字,使用多线程技术,提供多个用户连接。
RTP连接则实现了媒体实时数据流传输的功能。
两个连接的关系可看作,套接字连接把RTP连接包装起来。Socket先建立客户端与服务端的连接,之后再调用内部的RTP连接进行媒体数据传输。
流程如下图1:
编程细节描述
本例中核心技术可分为以下几个机制,即:截屏机制,传输实时数据流机制,接受数据流并播放机制,下面将详细分析这几个机制。
图1
1. 传输实时数据流机制
机制流程可分为以下几个步骤
a. 根据客户端发送的图片信息,构造一个媒体定位器
b. 通过媒体定位器获得数据源
c. 根据数据源产生一个处理器
d. 通过处理器得到相应的传输轨道
e. 设置轨迹支持格式为RTP并检查传输的媒体格式是否为RTP协议所支持的格式
f. 通过处理器获取输出数据源
g. 为每一个轨迹构造一个RTP管理器
h. 利用目标的IP地址与端口构造发送端的RTP会话,并赋给RTP管理器
i. 数据流传送给客户端
备注:
RTP协议支持两种图片格式,分别为H.263格式和JPEG格式, H.263只支持三种图像大小352*288,176*144和128*96像素。JPEG格式需要图像的宽和高是8像素的整数倍。因此想要屏截取图像的话,就要使用JPEG格式来传输,缺省情况下,图片格式为H.263。
2. 截获屏幕机制
在截屏的时候,屏幕的数据将作为一种新的数据源,为此,在应用RTP协议完成图像的传输前,需要先创建数据源,使屏幕图像数据作为RTP标准数据源的一种,通过继承javax.media.protocol包中的pushDataSouce类来实现创建新的push数据源类型,从而实现pushSourceStream接口来实现和管理数据源流。
创造新的数据源需要对JMF的数据源进行扩展 ,需构造一个具有以下形式的类名:
本例中该类的类名为com .sun .media .protocol .screen.DataSource ,完全按照创建数据源的结构原则构造的,其中“com.sun”作为
在本机制中,是由DataSource和LiveStream两个类实现,LiveStream类实现实时的截屏数据采集,它从媒体定位器中得到屏幕图像截取的起点位置尺寸等参数在实现了数据流的连接以及获得到开始通知后,开始以设定的频率取得屏幕区域图象(RGB格式),传输给数据缓冲区,形成“推”数据流。
LiveStream类中实现截取屏幕图像部分代码如下(关键语句):
…………
buffer.setFormat( rgbFormat );
buffer.setTimeStamp( (long) (seqNo * (1000 / frameRate) * 1000000) );
BufferedImage bi = robot.createScreenCapture(new Rectangle(x, y, width, height));
bi.getRGB(0, 0, width, height,(int[])outdata, 0, width);
…………
DataSource类是控制LiveStream类的对象实现的一种新的数据源,DataSource把LiveStream采集到的图像作为实时数据源。DataSource类中的getStreams( )实现了PushBufferDataSource类的抽象方法,而getContentType() , connect()等则重载了Controls接口的getControls(),getControl()方法。
3. 接收机制与播放机制
接收机制与播放机制主要用到了RTP监听器,即用于监听RTP事件的接口,如本例中用到了SessionListener接口 , ReceiveStreamListener接口 , ControllerListener接口。
监听器用来接收作为一个整体的RTP会话的状态改变消息,例如,RTPEvent类以及其子类SessionEvent,ReceiveStreamEvent,SendStreamEvent,ControllerEvent等。
SessionListener监听器用来接收作为一个整体的RTP会话的状态改变消息,例如在监听到新的参与者时,并把它添加到RTP会话中,该接口通过实现update()方法可以监听到SessionEvent。
ReceiveStreamListener监听器用来监听正在接收的RTP数据流的状态消息,该接口中的update()方法可以监听到ReceiveStreamEvent事件。
ControllerListener接口用于处理控制器(Player,Processors等)对象产生的事件的一个异步接口。通过使用该接口,能够实现播放器潜在的耗时操作的计时管理,例如预取操作。该接口中的controllerUpdate()方法可以监听到ControllerEvent事件。
该监听器工作机制如图2:
接收机制与播放机制实现流程如下:
a. 实现ReceiveStreamListener监听接口,监听NewReceiveStreamEvent事件。
b. 接收到NewReceiveStreamEvent事件后,接收媒体数据流,之后通过媒体数据流获取 RTP数据源。
c. Manager.creatPlayer()根据获得的数据源产生一个播放器。
d.为播放器添加监听器,等到播放器实现后,即可显示播放数据。
实现结果
截屏图像频率可设定在每秒1至30帧,经测试,当频率设定较高时,可使服务端的屏幕活动与客户端接收到的屏幕活动同步,达到了真正意义上的远程实时监控。
由于图像可为两种格式,客户端可设置图像的大小,同时图像位置和传输速率可以在一定范围内随意设定。因此,用户可以根据网络硬件条件来实现远程监控,从而达到最理想的效果。(结果如右图)
结束语
本例只是简单地体现了JMF的一些特点,并没有进行深入的研究。我们可以根据JMF的这些特点进行一些扩展,如网络会议,语音视频聊天,网络教学等等。
参考文献:
1. http://java.sun.com/products/java-media/jmf/2.1.1/solutions/
2. 《JAVA多媒体程序设计》 王峰 清华大学出版社
《JAVA网络编程实例》 孙一林 彭波 清华大学出版社