基于Java的远程视频会议系统

Ridiculous

发布日期: 2019-02-06 08:38:00 浏览量: 1641
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

研究背景

随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息,使越来越多的人开始通过互联网享受到网上生活、远程医疗、远程通讯的乐趣,缩短了时区和地域的距离。远程通信的各种优势给人们带来的方便也促使人们对这一领域进行更加深入的探索。基于不同平台以及不同开发工具的网络视频会议系统层出不穷。

视频会议系统在我国开始发展的初期,政府部门的应用就占据了重要位置,覆盖中央到直辖市和各省会城市的国家公众视频会议骨干网已经完工。自1994年9月投入使用以来,国务院等机关先后利用该网召开了三百多次全国范围的可视通讯会议。整个系统运行情况良好,得到了国家领导人和各部委领导的高度赞扬。近年来随着电子政务工程的逐步推进,政府部门更加关注视频会议系统建设。在经济发达地区(例如浙江、山东、广东),视频会议网已覆盖到地市级城市,有的甚至覆盖到县一级。除各级政府之外,其它诸如检察院、法院、公安和和水利等职能部门也是视频会议系统的重要用户。

视频会议系统还更广泛的应用于现代企业中。信息技术的迅猛发展,改变了各行各业的传统工作模式。信息的无限量扩大,交通工具的便捷,互联网技术的充分应用等导致了行业间竞争的全球化,这就要求现代部门、企业要具备更加灵敏的神经,更扁平化的管理,更快速的反应和决策,更贴切的市场宣传和服务。所有这一切是由于信息技术的发展带来的,同样也要求有先进的信息技术来提高部门、企业的竞争力。视频会议系统的可以跨越空间距离、灵活多样的面对面的交互,适应现代社会的方便、快捷、高效、快节奏,它为用户带来的经济效益,使视频会议系统的使用正在向各行各业渗透,给这一市场注入了新的活力。

1 系统概要设计

1.1 系统总体设计

1.1.1 系统流程

​ 服务器端流程如图所示:

​ 客户端流程如图 所示:

1.1.2 系统结构

通过学习和研究,我们通过多播技术实现了多点对多点的视频会议系统。整个系统包括这样几个模块:

文本聊天模块:该功能是网络视频会议的最基本的功能。通过该模块实现了会议成员的聊天通信。首先,每个会议职员通过与服务器连接加入到会议组,同时通过给自己取昵称将自己的昵称发送给服务器,让会议组的每个成员了解自己的身份。会议成员在聊天的时候不是将文本发送给某个人,而是发送给整个会议组。

视频通信模块:该功能利用JMF软件开发包,基于RTP协议实时发送和接受视频流。并且利用JMF多媒体组件构造播放器,进行实时播放。在实现了点对点的基本视频传输的基础上,我们应用了多播技术。当某个会议成员开始进行视频连接以后,他能通过视频会议系统看到所有其他已经建立视频连接会议成员。

1.2 系统接口的概要设计

1.2.1 服务器端设计

系统的服务器端的设计只需显示在线的用户,简单设计图示如下:

1.2.2 客户端设计

系统客户端的设计如下:

  1. 显示在线列表;

  2. 显示界面中用户视频;

  3. 用户聊天文本框;

  4. 视频连接及退出按钮。

简单设计图示如下:

2 系统详细设计

本系统的详细设计根据概要设计中所划分的各个功能模块进行详细的阐述:

2.1 文本聊天模块的详细设计

本系统要运用Java网络编程中Socket层次,即传统网络编程常采用的方式,通过Client/Server(客户端/服务器端)机构的应用程序之间建立Socket套接字连接,然后在连接之上进行数据通信。

通过SocketChannel建立基于UDP的无阻塞连接。创建一个无阻塞服务器,让每个客户端与之相连。某个客户端将文本消息发送给无阻塞的服务器,服务器在将这条文本消息组播给各个与之相连的客户端。

数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram).但是,由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。有可能一包或多个包在传输中丢失或遭到破坏。由于网络视频会议的实时性要求,不可能让视频传输的每一贞都准确无误。而TCP协议正是为数据可靠传输而设计的。那么选择UDP协议,即用户数据报协议(User Datagram Protocol,UDP),就成为一种必然。

基于UDP的Socket编程流程图如下:

服务器:

  1. serverSocketChannel = ServerSocketChannel.open();//打开连接通道
  2. serverSocketChannel.socket().bind(new InetSocketAddress(12345));//绑定IP与端口号
  3. getConnection();//接收连接请求
  4. 客户端:
  5. socketChannel = SocketChannel.open();打开连接通道
  6. socketChannel.connect(new InetSocketAddress(InetAddress.getByName
  7. (serverAddress),12345));//连接到服务器
  8. receiveMessage = new ReceivingThread();//构造接收信息线程
  9. receiveMessage.start();//运行线程
  10. socketChannel.write(writeBuffer);//往通道里写入消息
  11. socketChannel.read(readBuffer);//读取通道中消息

2.2 视频通信模块的详细设计

2.2.1 网络视频会议系统结构的详细设计

网络视频会议系统其根本目的是会议。会议的基本特征就是,参与会议的每个成员都可以了解到其他成员的状况,每个成员必须到场,然后进行交流,并且每个成员都应该看到所有的交流内容。在这个根本目的完成的基础上,才可以使网络视频会议的特点得以发挥。所以,我们的视频会议系统采用了多播的方法,使得会议的每个成员都可以得到会议的所有信息。

通过对视频会议基本特点的分析,系统结构图如下图所示:

2.2.2 视音频传输的详细设计

使用JMF API的RTP协议实现网络多媒体程序,可以分为两个部分,一部分是通过网络发送数据的主机端程序,另一部分是接收数据的客户端程序。

在JMF API中定义了几个与RTP有关的包,即javax.media.rtp、javax.media.rtp.enent、javax.media.rtp.rtcp登包,通过这些包提供的API,可以实现RTP数据流的传输、接受和回放。基于JMF多媒体数据流RTP传输、接受和回放过程图如下:

数据可以来自于多媒体文件,如视频文件,也可以来自于音/视频采集设备,如声卡、摄像头等。这些数据源的位置不同,格式不同,JMF通过一个称为媒体定位器(Media—Locator)的类对相应的数据源进行定位,MediaLocator对象内仔储了数据源的位置信息。JMF管理器(Manager)根据媒体定位器提供的信息创建数据源。这个数据源和文件、摄像头等物理数据源不同,是一个抽象的概念,是多种不同类型数据源的抽象。这样,JMF可以隐藏底层细节,使编程者在编程过程中不再考虑数据的具体来源和位置,只需考虑数据的格式、速率等信息就行了。

数据源生成后 ,可以直接交给播放器(Player),设定格式后就可以在本机播放了。但若要将数据流存储成其他格式的文件或者通过 RTP协议在网络上传输 ,则需要对其进行再处理。再处理工作由处理器(Processor)完成 ,处理后的数据源可以存储,也可以在网络上传输。通过 RTP进行传输前 ,需要建立会话管理器(SessionManager),建立 RTP会话后再开始发送流,发送时会打开两个端口,一个用于传输 RTP数据流;另一个用来传输 RTCP包。

多媒体数据流的接收过程是发送的逆过程。由RTP信道获得的数据流作为接收端的数据源,对数据源处理后便可以实现数据流的回放、存储,甚至再发送。

详细设计传输过程:

  1. dsVideo = createDataSource(vf);//创建视频数据源
  2. dsAudio = createDataSource(af);//创建音频数据源
  3. devices = CaptureDeviceManager.getDeviceList(format);//得到类型为format的设备的清单,存放在表devices中
  4. ds = Manager.createDataSource(ml);//通过媒体定位器创建数据源
  5. RTPTransmit rtpTransmit = new RTPTransmit(processor,ipAddr,port);//构造RTP会话
  6. result = createProcessor();// 产生一个处理器
  7. result = createTransmitter();产生RTP会话,将处理器输出的数据传给指定的IP地址的指定的端口号
  8. processor.start();// 让处理器开始传输

2.2.3 多播的详细设计

多播基本思想是一个源IP主机只进行一次发送,多个接收者(目标 IP主机)可以接收到相同数据的一个拷贝。但是多个接收者必须都注册加入同一多播组。IP多播服务是一种开放的服务模型,任何主机可以随时加入或退出某个多播组。

利用这种思想,可以实现会议中的多点对多点的视频传输,已达到组织会议的目的。多播系统结构图:

多播实现过程:

  1. group = InetAddress.getByName(MuiltAddr); //设置组播地址
  2. socket = new MulticastSocket(port); //创建MulticastSocket类并将端口与之关联
  3. socket.joinGroup(group); //加入此组播组

2.3 系统界面的详细设计

本系统在进行界面设计的时候考虑了系统的功能,对各功能模块进行详细合理的布局:

  1. 把一些功能加到界面中的菜单中,有连接服务器,连接视频,断开连接,退出等子菜单项。

  2. 在界面中添加在线用户列表框,用以显示在线的用户。

  3. 在界面中用一个大的Panel 装载举行会议时的各个用户的视频框。

  4. 在界面中添加实现简单聊天室功能的聊天文本框。

  5. 在界面底端有一些功能按钮,如连接视频,发送信息等。

3 系统实现

3.1 系统实现

3.1.1 服务器端套接字建立

数据通讯是双向的,客户端通过套接字请求数据通讯后,服务器端需要有一个响应客户端请求通讯的服务程序,该服务器程序应用ServerSocket类完成与客户端的通讯。

ServerSocket类用来监听和响应客户端的连接请求,并接受客户端发送的数据信息。ServerSocket类在服务器端等待其他机器同它的连接,一旦客户端程序建立一个套接字连接,ServerSocket类就会通过accept()方法返回一个对应的服务器端套接字对象,以便进行直接通讯。从两台计算机连接成功起,服务器端与客户端就得到了一个真正的“套接字-套接字”连接,此时利用Socket类中的getInputStream()及getOutputStream()方法从每端的套接字产生对应的InputStream和OutputStream对象,并将套接字数据流封装到缓冲区内以便进行两台机器之间的数据通讯。

  1. serverSocketChannel = ServerSocketChannel.open();//打开连接通道
  2. serverSocketChannel.socket().bind(new InetSocketAddress(12345));
  3. //绑定IP与端口号
  4. getConnection();//接收连接请求
  5. charSet = Charset.forName("UTF-8");//开启服务器套接字通道
  6. serverSocketChannel = ServerSocketChannel.open();
  7. serverSocketChannel.socket().bind(newInetSocketAddress(12345)); serverSocketChannel.configureBlocking(false);
  8. //设置阻塞模式为非阻塞模式等待一个连接

3.1.2 客户端套接字建立

客户端使用Socket类的方法建立(类似于服务器端),客户端向套接字对象中的数据流输出和获取数据。客户端程序试图与服务器之间在Socket层次上建立一个连接,通过套接字输入流读取方法从套接字数据流中获取服务器信息,以及写入数据到套接字输出流中向服务器发送信息,并且等待服务器的答复。如果连接成功,则该客户端程序通过套接字与服务器可以进行正常的数据交换。

  1. socketChannel = SocketChannel.open();打开连接通道
  2. socketChannel.connect(new InetSocketAddress(InetAddress.getByName
  3. (serverAddress),12345));//连接到服务器
  4. receiveMessage = new ReceivingThread();//构造接收信息线程
  5. receiveMessage.start();//运行线程
  6. socketChannel.write(writeBuffer);//往通道里写入消息
  7. socketChannel.read(readBuffer);//读取通道中消息

3.1.3 视音频发送

视音频数据以RTP实时流的形式发送出去,通过会话管理器(Session Manager)传输RTP数据的步骤为:

  1. 产生一个JMF处理器(Processor),为每一种RTP格式设置相应的轨迹格式。

  2. 从处理器获取输出数据源。

  3. 会话管理器产生一个发送数据流,即以数据源和序号作为参数调用会话管理器的createSendStream()方

  4. 开始会话传输。

  5. 通过监听ControllerEvent事件控制会话的过程。

  6. 停止会话,删除会话管理器。

定义以下内容:

  1. // 媒体定位 IP 端口 处理器 会话管理器 输出数据源
  2. private MediaLocator Locator;
  3. private String IpAddress;
  4. private int portBase;
  5. private Processor processor=null;
  6. private RTPManger rtpMgrs[];
  7. private DataSource dataOutput=null;

具体实现函数如下:

  1. //发送数据函数
  2. public RTPTransmit(Processor processor,String ipAddress, String pb){}
  3. //为媒体定位器产生一个处理器
  4. private String createProcessor(){}
  5. // 为处理器的每一个媒体磁道产生一个RTP会话
  6. private String createTransmitter() {}
  7. // 让处理器开始传输
  8. public synchronized String start(){}
  9. // 停止传输
  10. public void stop(){}
  11. //组播线程类
  12. class CreateJoinMuiltcastThread extends Thread {}
  13. //处理器的状态监听器类
  14. class StateListener implements ControllerListener {}

3.1.4 视音频接收

接收网络实时媒体数据流是通过java.media包中定义的各种RTP事件监听器和RTP事件处理类来处理和控制的,使用java.media包中的Player类可以实时播放网络多媒体数据流,java.media包中的处理媒体流接收和播放完成了整个接收RTP数据的过程。接收部分程序为每一种新接收到的媒体数据流产生一个播放器,一边接收媒体流数据,一边将媒体数据播放出来,其实现分为以下几个步骤:

  1. 实现ReceiveStreamListener监听接口,监听NewReceiveStreamEvent事件。

  2. 当接收到NewReceiveStreamEvent事件后,通过事件获取接收媒体数据流(ReceiveStream),然后通过接收媒体数据流获取RTP数据源(DataSource)。

  3. 将数据源传给Manager.createPlayer()产生一个播放器。

  4. 给播放器添加监听器,等到播放器实现后,即可显示播放数据。

定义以下内容:

  1. String sessions[] = null; // RTP会话字符串数组
  2. RTPManager mgrs[] = null; // RTP管理器数组
  3. Vector playerPanels = null; // 管理播放器窗口的向量
  4. boolean dataReceived = false; // 是否接收到数据的标志
  5. Object dataSync = new Object(); // 同步对象

具体实现函数如下:

  1. //接收数据实现函数
  2. public Receive(String sessions[]) {}
  3. //初始化RTP会话,准备接收数据
  4. protected boolean initialize(){}
  5. //关闭播放窗口
  6. protected void close(){}
  7. //判断数据是否接收完成
  8. public boolean isDone() {}
  9. // 通过播放器查找播放窗口
  10. PlayerPanel find(Player p) {}
  11. // 通过接收数据流查找播放窗口
  12. PlayerPanel find(ReceiveStream strm) {}
  13. //实现ReceiveStreamListener监听接口
  14. public synchronized void update( ReceiveStreamEvent evt) {}

参考文献

[1] H.M.Deitel P.J.Deitel,Java 《程序设计教程》 清华大学出版社

[2] 彭波 孙一林 《Java多媒体技术》 清华大学出版社

[3] 刘成德 李 祥 《基IPMulticast/JMF的多媒体网络会议系统的设计与实现》

[4] Elliotte Rusty Harold 《Java网络编程》 中国电力出版社

[5] 毛黎莉 潘建国 《基于JMF的RTP应用分析与研究》

[6] 周静 邹北骥 《利用JMF 实现RTP流的传输与播放》

上传的附件 cloud_download 基于Java的视频会议系统.zip ( 3.87mb, 57次下载 )
error_outline 下载需要9点积分

keyboard_arrow_left上一篇 : 基于java和Sql Server数据库的停车场管理系统 利用哈希表实现电话号码查询系统 : 下一篇keyboard_arrow_right



haiChen
2019-04-30 10:22:57
老兄,运行你的代码连接超时是怎么回事
xiaoheipro
2020-03-01 01:28:15
请问报这个错是为什么呢? ! No Devices for RGB, 160x120, FrameRate=15.0 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at VideoMeeting.client.RTPTransmit.waitForState(RTPTransmit.java:233)

发送私信

难过时,吃一粒糖,告诉自己生活是甜的

10
文章数
13
评论数
最近文章
eject