目录
[2.1 系统设计问题](#2.1 系统设计问题)
[2.3 界面设计问题](#2.3 界面设计问题)
[4.1 服务器端套接字建立](#4.1 服务器端套接字建立)
[4.2 客户端套接字建立](#4.2 客户端套接字建立)
[4.3 视音频发送](#4.3 视音频发送)
[4.4 视音频接收](#4.4 视音频接收)
一.研究目的
随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息,使越来越多的人开始通过互联网享受到网上生活、远程医疗、远程通讯的乐趣,缩短了时区和地域的距离。远程通信的各种优势给人们带来的方便也促使人们对这一领域进行更加深入的探索。基于不同平台以及不同开发工具的网络视频会议系统层出不穷。
视频会议系统在我国开始发展的初期,政府部门的应用就占据了重要位置,覆盖中央到直辖市和各省会城市的国家公众视频会议骨干网已经完工。自1994年9月投入使用以来,国务院等机关先后利用该网召开了三百多次全国范围的可视通讯会议。整个系统运行情况良好,得到了国家领导人和各部委领导的高度赞扬。近年来随着电子政务工程的逐步推进,政府部门更加关注视频会议系统建设。在经济发达地区(例如浙江、山东、广东),视频会议网已覆盖到地市级城市,有的甚至覆盖到县一级。除各级政府之外,其它诸如检察院、法院、公安和和水利等职能部门也是视频会议系统的重要用户。
视频会议系统还更广泛的应用于现代企业中。信息技术的迅猛发展,改变了各行各业的传统工作模式。信息的无限量扩大,交通工具的便捷,互联网技术的充分应用等导致了行业间竞争的全球化,这就要求现代部门、企业要具备更加灵敏的神经,更扁平化的管理,更快速的反应和决策,更贴切的市场宣传和服务。所有这一切是由于信息技术的发展带来的,同样也要求有先进的信息技术来提高部门、企业的竞争力。视频会议系统的可以跨越空间距离、灵活多样的面对面的交互,适应现代社会的方便、快捷、高效、快节奏,它为用户带来的经济效益,使视频会议系统的使用正在向各行各业渗透,给这一市场注入了新的活力。
二.需求分析
开始对课题所研究的问题不是很明确,如其应用范围,具体功能等。通过老师的讲解及指导和查相关资料得以解决。
由于几乎没有使用过视频会议,对其的了解也不太深刻,老师给讲解了一些内容,在网上下载了一个视频会议系统的软件试用了一下,并查阅了许多相关资料,这才可以对该课题进行需求分析。
2.1 系统设计问题
在该视频会议系统的设计上遇到了很多问题:如何准确的定位网络上一台或多台主机,如何找到主机后如何可靠高效的进行数据传输;建立网络之间会话;图像的采集、压缩及编码;网络视频的传输;系统的界面设计等问题。
2.2代码实现问题
在具体的功能实现上,编码遇到了极大的困难。因为该课题需要用到很多以前从未接触到的知识,如需要用JMF,RTP协议传输视频,JAVA socket编程,如何采集图像等知识。在用JAVA语言编码过程中,因编程规范及其他各种语法问题出现了很多错误,通过老师指导和查阅资料得以解决。
2.3 界面设计问题
本课题采用eclipse开发平台,装载ve插件后,用其进行图形界面的设计和实现。并且在试用所下载的视频会议系统后,有很大心得,根据其界面的合理性,模仿设计本课题中界面。
本课题致力于实现实现点对点的视频传输并完成基本功能(如动态视频传输、文本传输等),提供多人同时在线举行会议。包含以下内容:
1.动态视频传输:视频双方可以看到对方的动态图像。
2.声音传输:在视频或非视频状态下可以听到对方的声音,进行语音交流。
3.文本传输:可以通过文本输入进行交流。
三.系统详细设计
本系统要运用Java网络编程中Socket层次,即传统网络编程常采用的方式,通过Client/Server(客户端/服务器端)机构的应用程序之间建立Socket套接字连接,然后在连接之上进行数据通信。
通过SocketChannel建立基于UDP的无阻塞连接。创建一个无阻塞服务器,让每个客户端与之相连。某个客户端将文本消息发送给无阻塞的服务器,服务器在将这条文本消息组播给各个与之相连的客户端。
数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram).但是,由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。有可能一包或多个包在传输中丢失或遭到破坏。由于网络视频会议的实时性要求,不可能让视频传输的每一贞都准确无误。而TCP协议正是为数据可靠传输而设计的。那么选择UDP协议,即用户数据报协议(User Datagram Protocol,UDP),就成为一种必然。
基于UDP的Socket编程流程图如下:

服务器端流程如图

客户端流程如图3.2 所示:

四.代码展示
4.1 服务器端套接字建立
数据通讯是双向的,客户端通过套接字请求数据通讯后,服务器端需要有一个响应客户端请求通讯的服务程序,该服务器程序应用ServerSocket类完成与客户端的通讯。
ServerSocket类用来监听和响应客户端的连接请求,并接受客户端发送的数据信息。ServerSocket类在服务器端等待其他机器同它的连接,一旦客户端程序建立一个套接字连接,ServerSocket类就会通过accept()方法返回一个对应的服务器端套接字对象,以便进行直接通讯。从两台计算机连接成功起,服务器端与客户端就得到了一个真正的"套接字-套接字"连接,此时利用Socket类中的getInputStream()及getOutputStream()方法从每端的套接字产生对应的InputStream和OutputStream对象,并将套接字数据流封装到缓冲区内以便进行两台机器之间的数据通讯。
serverSocketChannel = ServerSocketChannel.open();//打开连接通道
serverSocketChannel.socket().bind(new InetSocketAddress(12345));
//绑定IP与端口号
getConnection();//接收连接请求
charSet = Charset.forName("UTF-8");//开启服务器套接字通道
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(newInetSocketAddress(12345)); serverSocketChannel.configureBlocking(false);
//设置阻塞模式为非阻塞模式等待一个连接
4.2 客户端套接字建立
客户端使用Socket类的方法建立(类似于服务器端),客户端向套接字对象中的数据流输出和获取数据。客户端程序试图与服务器之间在Socket层次上建立一个连接,通过套接字输入流读取方法从套接字数据流中获取服务器信息,以及写入数据到套接字输出流中向服务器发送信息,并且等待服务器的答复。如果连接成功,则该客户端程序通过套接字与服务器可以进行正常的数据交换。
socketChannel = SocketChannel.open();打开连接通道
socketChannel.connect(new InetSocketAddress(InetAddress.getByName
(serverAddress),12345));//连接到服务器
receiveMessage = new ReceivingThread();//构造接收信息线程
receiveMessage.start();//运行线程
socketChannel.write(writeBuffer);//往通道里写入消息
socketChannel.read(readBuffer);//读取通道中消息
4.3 视音频发送
视音频数据以RTP实时流的形式发送出去,通过会话管理器(Session Manager)传输RTP数据的步骤为:
- 产生一个JMF处理器(Processor),为每一种RTP格式设置相应的轨迹格式。
- 从处理器获取输出数据源。
- 会话管理器产生一个发送数据流,即以数据源和序号作为参数调用会话管理器的createSendStream()方法。
- 开始会话传输。
- 通过监听ControllerEvent事件控制会话的过程。
- 停止会话,删除会话管理器。
定义以下内容:
// 媒体定位 IP 端口 处理器 会话管理器 输出数据源
private MediaLocator Locator;
private String IpAddress;
private int portBase;
private Processor processor=null;
private RTPManger rtpMgrs[];
private DataSource dataOutput=null;
具体实现函数如下:
//发送数据函数
public RTPTransmit(Processor processor,String ipAddress, String pb){}
//为媒体定位器产生一个处理器
private String createProcessor(){}
// 为处理器的每一个媒体磁道产生一个RTP会话
private String createTransmitter() {}
// 让处理器开始传输
public synchronized String start(){}
// 停止传输
public void stop(){}
//组播线程类
class CreateJoinMuiltcastThread extends Thread {}
//处理器的状态监听器类
class StateListener implements ControllerListener {}
4.4 视音频接收
接收网络实时媒体数据流是通过java.media包中定义的各种RTP事件监听器和RTP事件处理类来处理和控制的,使用java.media包中的Player类可以实时播放网络多媒体数据流,java.media包中的处理媒体流接收和播放完成了整个接收RTP数据的过程。接收部分程序为每一种新接收到的媒体数据流产生一个播放器,一边接收媒体流数据,一边将媒体数据播放出来,其实现分为以下几个步骤:
-
实现ReceiveStreamListener监听接口,监听NewReceiveStreamEvent事件。
-
当接收到NewReceiveStreamEvent事件后,通过事件获取接收媒体数据流(ReceiveStream),然后通过接收媒体数据流获取RTP数据源(DataSource)。
-
将数据源传给Manager.createPlayer()产生一个播放器。
-
给播放器添加监听器,等到播放器实现后,即可显示播放数据。
定义以下内容:
String sessions[] = null; // RTP会话字符串数组
RTPManager mgrs[] = null; // RTP管理器数组
Vector playerPanels = null; // 管理播放器窗口的向量
boolean dataReceived = false; // 是否接收到数据的标志
Object dataSync = new Object(); // 同步对象
具体实现函数如下:
//接收数据实现函数
public Receive(String sessions[]) {}
//初始化RTP会话,准备接收数据
protected boolean initialize(){}
//关闭播放窗口
protected void close(){}
//判断数据是否接收完成
public boolean isDone() {}
// 通过播放器查找播放窗口
PlayerPanel find(Player p) {}
// 通过接收数据流查找播放窗口
PlayerPanel find(ReceiveStream strm) {}
//实现ReceiveStreamListener监听接口
public synchronized void update( ReceiveStreamEvent evt) {}
五.免费源码获取方式
使用JAVA +Mysql+SSM框架