基于Java的远程视频会议系统(源码+系统+论文)
第一章 概述
1.1 本课题的研究背景
随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息,使越来越多的人开始通过互联网享受到网上生活、远程医疗、远程通讯的乐趣,缩短了时区和地域的距离。远程通信的各种优势给人们带来的方便也促使人们对这一领域进行更加深入的探索。基于不同平台以及不同开发工具的网络视频会议系统层出不穷。
视频会议系统在我国开始发展的初期,政府部门的应用就占据了重要位置,覆盖中央到直辖市和各省会城市的国家公众视频会议骨干网已经完工。自1994年9月投入使用以来,国务院等机关先后利用该网召开了三百多次全国范围的可视通讯会议。整个系统运行情况良好,得到了国家领导人和各部委领导的高度赞扬。近年来随着电子政务工程的逐步推进,政府部门更加关注视频会议系统建设。在经济发达地区(例如浙江、山东、广东),视频会议网已覆盖到地市级城市,有的甚至覆盖到县一级。除各级政府之外,其它诸如检察院、法院、公安和和水利等职能部门也是视频会议系统的重要用户。
视频会议系统还更广泛的应用于现代企业中。信息技术的迅猛发展,改变了各行各业的传统工作模式。信息的无限量扩大,交通工具的便捷,互联网技术的充分应用等导致了行业间竞争的全球化,这就要求现代部门、企业要具备更加灵敏的神经,更扁平化的管理,更快速的反应和决策,更贴切的市场宣传和服务。所有这一切是由于信息技术的发展带来的,同样也要求有先进的信息技术来提高部门、企业的竞争力。视频会议系统的可以跨越空间距离、灵活多样的面对面的交互,适应现代社会的方便、快捷、高效、快节奏,它为用户带来的经济效益,使视频会议系统的使用正在向各行各业渗透,给这一市场注入了新的活力。
1.2 本课题的研究意义
从实用方面:
视频会议系统是指通过现有的各种电气通讯传输媒体,将人物的静态/动态图像、语音、文字、图片等多种信息分送到各个用户的计算机上,使得在地理上分散的用户可以共聚一处,通过图形、声音等多种方式交流信息,增加双方对内容的理解能力。视频会议系统对于减少差旅费用等机构开支;提高机构运作效率;提高机构形象有利于加强对外交往;有利于政策方针的迅速准确传达;有利于广泛收集意见;有利于加强内部交流;员工培训等方面带来巨大的直接和间接效益。由于视频会议系统的这些优点,使得视频会议系统备受关注。并且已经有越来越多的人利用这种方式进行交流沟通,不仅方便而且拉近了人与人之间的距离。现在的一些软件像QQ以及MSN等软件为人们的视频聊天提供了许多方便。
从学习知识方面:
通过做这样一个课题,对学习无疑是十分有益的。尤其在学习了JAVA编程之后更有欲望对其进行深层次的学习,并且可以结合各方面的知识进行多方面的学习,积累更多知识。
1.3 本报告的目的、内容及作者的主要贡献
1.3.1 本报告的目的
本报告对基于JAVA的点对点视频会议系统做出详细地需求分析,并对其设计与实现过程进行详细的论述。目的在于阐明本视频会议系统如何能够实现多人在线举行会议。
1.3.2 本报告的内容
本报告内容上从视频会议的开发背景开始论述,研究并确定了开发环境,并对该视频会议系统的需求做出了详细的分析,根据其需求及开发工具的功能特性确立课题的设计方案及开发策略。并对课题的概要设计、详细设计以及代码实现过程和后期的测试过程,须改进的部分都进行了详细的说明。
1.3.3 作者主要贡献
本报告中,作者的主要贡献:对该视频会议系统进行可行性分析、需求分析、功能模块设计、各个功能的代码实现、良好用户操作界面的设计与实现、对各功能实现结果的测试等。
1.4 国内外相近研究课题的特点及发展趋势
视频会议是近几年才发展起来的多媒体通信技术。视频会议可实时传送声音、图象;使每位与会者都有身临其境的感觉。此外,它还提供文件传真、静止图文传送、白板等一系列辅助服务项目。视频会议最初是"点对点"的会议传输(point to point),现已发展到"一点对多点"(point to multi points)及"多点到多点"(multi points to multi points)阶段。
视频会议系统的关键技术 :1)多媒体信息处理技术2)宽带网络技术3)分布式处理技术视频会议实现点对点、一点对多点、多点之间的实时同步交互通信。
视频会议的发展趋势:
- 系统功能多元化具有图文同传功能:除视音频外,可以方便地传送和显示电脑文档用于培训、汇报、交流;视频会议与电话系统浑然一体:可方便接入会议电话系统,通过电话、手机也可加入会议等。
- 系统组网多样化,有网络就能开会。
- 图像清晰化:视频会议需要更优异、更清晰、更成熟的图像编解码技术。
- 使用、维护简捷化:易于使用,可自行组织、控制会议;进行远程管理、远程维护、升级,降低维护成本;更新设计,大幅提高系统稳定性。
1.5 现行研究存在的问题及解决办法
1.5.1 需求分析问题
开始对课题所研究的问题不是很明确,如其应用范围,具体功能等。通过老师的讲解及指导和查相关资料得以解决。
由于几乎没有使用过视频会议,对其的了解也不太深刻,老师给讲解了一些内容,在网上下载了一个视频会议系统的软件试用了一下,并查阅了许多相关资料,这才可以对该课题进行需求分析。
1.5.2 系统设计问题
在该视频会议系统的设计上遇到了很多问题:如何准确的定位网络上一台或多台主机,如何找到主机后如何可靠高效的进行数据传输;建立网络之间会话;图像的采集、压缩及编码;网络视频的传输;系统的界面设计等问题。
1.5.4 代码实现问题
在具体的功能实现上,编码遇到了极大的困难。因为该课题需要用到很多以前从未接触到的知识,如需要用JMF,RTP协议传输视频,JAVA socket编程,如何采集图像等知识。在用JAVA语言编码过程中,因编程规范及其他各种语法问题出现了很多错误,通过老师指导和查阅资料得以解决。
1.5.5 界面设计问题
本课题采用eclipse开发平台,装载ve插件后,用其进行图形界面的设计和实现。并且在试用所下载的视频会议系统后,有很大心得,根据其界面的合理性,模仿设计本课题中界面。
1.6 本课题要达到的设计目标
本课题致力于实现实现点对点的视频传输并完成基本功能(如动态视频传输、文本传输等),提供多人同时在线举行会议。包含以下内容:
1.动态视频传输:视频双方可以看到对方的动态图像。
2.声音传输:在视频或非视频状态下可以听到对方的声音,进行语音交流。
3.文本传输:可以通过文本输入进行交流。
第二章 系统分析
本课题为实现多人在线同时举行会议的功能,对该视频会议系统做了详细的系统分析。包括系统的可行性分析、对开发用到的关键技术的介绍以及系统的需求分析。
2.1 可行性分析
2.1.1 技术可行性
网络视频会议是顺应市场的需求而设计的。采用JAVA 编程语言,用eclipse开发平台实现。用到多媒体技术(JAVA 多媒体框架JMF),视频和音频用TRP协议传输,用到Socket编程技术,多播技术。网络视频会议首先是基于网络传输的,那么就必然要依托于JAVA网络编程的相关知识。在这基础上,由于相关音频、视频,所以还要涉及到JAVA的多媒体技术的相关知识,即JMF (Java Media Framework)。利用JAVA的这个组件,我们可以方便的处理多媒体文件,并基于RTP协议进行实时传输。
2.1.2 操作可行性
系统运行于Windows环境,其用户操作界面友好,便于操作,适合视频会议流程。
系统的基本操作如下:
1.启动服务器;
2.用户连接到服务器;
3.进行视频连接;
4.举行会议;
5.会议完毕,退出系统。
2.2 采用的关键技术介绍
2.2.1 JAVA多媒体技术
JAVA多媒体技术的核心是Java媒体框架 JMF(Java Media Framework)。JMF中包含了许多用于处理多媒体的API,它是一个很好的多媒体编程工具,同时也是一个相当复杂的系统。JMF的主要应用功能之一是多媒体数据流在网络中的实时传输,其RTP包中提供的RTP包中提供的RTPManager(RTP管理器)、TrackContol(轨道控制器)、SendStream(发送数据流)、ReceiveStream(接收数据流)、InetAddress(IP地址)和SessionAddress(会话地址)等类使得编写网络实时数据传输变得容易,基于RTP协议的RTP应用程序框架为实现流媒体在网络中实时传输提供了Java程序框架,应用它可方便的实现多媒体数据流在网络中的实时传输。实时传输协议RTP是在Internet网上针对多媒体数据流的一种传输协议,RTP被定义为在一对一获一对多的传输情况下工作的,其目的是提供时间信息和实现多媒体数据流的同步。RTP由RTP和RTCP(实时控制协议)两个部分组成。RTP本身并不能为按顺序传送数据包提供可靠的传送机制,可不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。
2.2.2 JAVA 网络编程技术
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram).但是,由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。有可能一包或多个包在传输中丢失或遭到破坏。由于网络视频会议的实时性要求,不可能让视频传输的每一贞都准确无误。而TCP协议正是为数据可靠传输而设计的。那么选择UDP协议,即用户数据报协议(User Datagram Protocol,UDP),就成为一种必然。
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通讯。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。
多播通信是一类特殊的IP地址(D类IP地址)这些IP地址并不和任何主机关联,而是专门为多播通信保留下来的,地址范围224.0.0.1-239.255.255.255这间,其中224.0.0.1-224.0.0.255是留作为多播路由信息使用的。此外,所有其它D类IP地址都可以随便进行通信。
2.3 系统需求分析
由于政府部门和企事业单位对视频会议系统有强烈需求,并且人们对视频和音频信息的需求愈来愈强烈,所以有必要开发一个网络视频会议系统。并且近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息,使越来越多的人开始通过互联网享受到网上生活的乐趣,缩短了时区和地域的距离。远程通信的各种优势给人们带来的方便也促使人们对这一领域进行更加深入的探索。现代社会中信息的无限量扩大,交通工具的便捷,互联网技术的充分应用等导致了行业间竞争的全球化,这就要求现代部门、企业要具备更加灵敏的神经,更扁平化的管理,更快速的反应和决策,更贴切的市场宣传和服务。所有这一切是由于信息技术的发展带来的,同样也要求有先进的信息技术来提高部门、企业的竞争力。视频会议系统的可以跨越空间距离、灵活多样的面对面的交互,适应现代社会的方便、快捷、高效、快节奏,它为用户带来的经济效益,使视频会议系统的使用正在向各行各业渗透。视频会议系统是支持人们远距离进行实时信息交流、开展协同工作的应用系统。视频会议系统实时传输视频与音频信息,使协作成员可以远距离进行直观、真实的视音频交流。另一方面,利用多媒体技术的支持,视频会议系统可以帮助使用者对工作中各种信息进行处理,如共享数据、共享应用程序等,从而构造出一个多人共享的工作空间。所以,开发一个网络视频会议系统是很有必要的。
第三章 系统概要设计
3.1 系统总体设计
3.1.1 运行环境
操作系统:Windows 2000/XP/2003 等
安装JDK
安装JMF
安装eclipse
安装摄像头
3.1.2 系统流程
服务器端流程如图3.1所示:
图3.1 服务器端流程图
客户端流程如图3.2 所示:
图3.2 客户端流程图
3.1.3 系统结构
通过学习和研究,我们通过多播技术实现了多点对多点的视频会议系统。整个系统包括这样几个模块:
文本聊天模块:该功能是网络视频会议的最基本的功能。通过该模块实现了会议成员的聊天通信。首先,每个会议职员通过与服务器连接加入到会议组,同时通过给自己取昵称将自己的昵称发送给服务器,让会议组的每个成员了解自己的身份。会议成员在聊天的时候不是将文本发送给某个人,而是发送给整个会议组。
视频通信模块:该功能利用JMF软件开发包,基于RTP协议实时发送和接受视频流。并且利用JMF多媒体组件构造播放器,进行实时播放。在实现了点对点的基本视频传输的基础上,我们应用了多播技术。当某个会议成员开始进行视频连接以后,他能通过视频会议系统看到所有其他已经建立视频连接会议成员。
3.2 系统接口的概要设计
3.2.1 服务器端设计
系统的服务器端的设计只需显示在线的用户,简单设计图示如下:
图3.3 系统服务器端设计
3.2.2 客户端设计
系统客户端的设计如下:
- 显示在线列表;
- 显示界面中用户视频;
- 用户聊天文本框;
- 视频连接及退出按钮。
简单设计图示如下:
图3.4 系统客户端设计
3.3 系统出错处理设计
3.3.1 出错信息及处理方法
系统输出信息的形式、含意及处理方法。见表3.1。
表3.1 出错信息及处理方法
故障情况 | 系统提示信息内容与形式 | 处理方法 |
开启服务器失败 | 提示失败信息“开启服务器失败,请重试” 弹出对话框 | 重新开启服务器 |
登录失败 | 提示失败信息“登录失败,请重试” 弹出对话框 | 重新登录 |
连接视频失败 | 提示失败信息“视频连接失败” 弹出对话框 | 重新连接视频 |
3.3.2 系统维护设计
为了保证系统的稳定运行,本系统在设计时考虑到了系统的安全性、可靠性、兼容性、可扩展性等因素。了很多验证条件,尽量保证信息的合法性与正确性,是系统能够稳定运行。此外本系统的设计还保证了系统功能的可扩展性。
安全性:在视频会议系统前端安置加密机或者直接使用加密网卡可以提高在传输过程中的安全性。加密设备可直接提供加密能力,从而实现用户的身份验证以及未经授权的数据访问和恶意侵犯。
可靠性:该系统设计的合理性保证了可靠稳定的运行,支持当前大多数硬件平台,核心线程优先保护、数据流容错的设计思路使系统可更加稳定的运转。
兼容性:该系统拥有开放的集成接口,可以非常灵活的与用户集成,并满足用户的需要,实现其功能。
可扩展性:该系统可进行再扩展,在此基础上扩展为一点对多点,多点对多点的视频会议系统。
第四章 系统详细设计
本系统的详细设计根据概要设计中所划分的各个功能模块进行详细的阐述:
4.1 文本聊天模块的详细设计
本系统要运用Java网络编程中Socket层次,即传统网络编程常采用的方式,通过Client/Server(客户端/服务器端)机构的应用程序之间建立Socket套接字连接,然后在连接之上进行数据通信。
通过SocketChannel建立基于UDP的无阻塞连接。创建一个无阻塞服务器,让每个客户端与之相连。某个客户端将文本消息发送给无阻塞的服务器,服务器在将这条文本消息组播给各个与之相连的客户端。
数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram).但是,由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。有可能一包或多个包在传输中丢失或遭到破坏。由于网络视频会议的实时性要求,不可能让视频传输的每一贞都准确无误。而TCP协议正是为数据可靠传输而设计的。那么选择UDP协议,即用户数据报协议(User Datagram Protocol,UDP),就成为一种必然。
基于UDP的Socket编程流程图如下:
图4.1 数据报套接字流程图
服务器:
serverSocketChannel = ServerSocketChannel.open();//打开连接通道serverSocketChannel.socket().bind(new InetSocketAddress(12345));//绑定IP与端口号getConnection();//接收连接请求
客户端:
socketChannel = SocketChannel.open();打开连接通道socketChannel.connect(new InetSocketAddress(InetAddress.getByName(serverAddress),12345));//连接到服务器receiveMessage = new ReceivingThread();//构造接收信息线程receiveMessage.start();//运行线程socketChannel.write(writeBuffer);//往通道里写入消息socketChannel.read(readBuffer);//读取通道中消息
4.2 视频通信模块的详细设计
4.2.1 网络视频会议系统结构的详细设计
网络视频会议系统其根本目的是会议。会议的基本特征就是,参与会议的每个成员都可以了解到其他成员的状况,每个成员必须到场,然后进行交流,并且每个成员都应该看到所有的交流内容。在这个根本目的完成的基础上,才可以使网络视频会议的特点得以发挥。所以,我们的视频会议系统采用了多播的方法,使得会议的每个成员都可以得到会议的所有信息。
通过对视频会议基本特点的分析,系统结构图如下图所示:
图4.2 网络视频会议系统结构图
4.2.2 视音频传输的详细设计
使用JMF API的RTP协议实现网络多媒体程序,可以分为两个部分,一部分是通过网络发送数据的主机端程序,另一部分是接收数据的客户端程序。
在JMF API中定义了几个与RTP有关的包,即javax.media.rtp、javax.media.rtp.enent、javax.media.rtp.rtcp登包,通过这些包提供的API,可以实现RTP数据流的传输、接受和回放。基于JMF多媒体数据流RTP传输、接受和回放过程图如下:
图4.3 基于JMF多媒体数据流RTP传输、接受和回放过程
数据可以来自于多媒体文件,如视频文件,也可以来自于音/视频采集设备,如声卡、摄像头等。这些数据源的位置不同,格式不同,JMF通过一个称为媒体定位器(Media—Locator)的类对相应的数据源进行定位,MediaLocator对象内仔储了数据源的位置信息。JMF管理器(Manager)根据媒体定位器提供的信息创建数据源。这个数据源和文件、摄像头等物理数据源不同,是一个抽象的概念,是多种不同类型数据源的抽象。这样,JMF可以隐藏底层细节,使编程者在编程过程中不再考虑数据的具体来源和位置,只需考虑数据的格式、速率等信息就行了。
数据源生成后 ,可以直接交给播放器(Player),设定格式后就可以在本机播放了。但若要将数据流存储成其他格式的文件或者通过 RTP协议在网络上传输 ,则需要对其进行再处理。再处理工作由处理器(Processor)完成 ,处理后的数据源可以存储,也可以在网络上传输。通过 RTP进行传输前 ,需要建立会话管理器(SessionManager),建立 RTP会话后再开始发送流,发送时会打开两个端口,一个用于传输 RTP数据流;另一个用来传输 RTCP包。
多媒体数据流的接收过程是发送的逆过程。由RTP信道获得的数据流作为接收端的数据源,对数据源处理后便可以实现数据流的回放、存储,甚至再发送。
详细设计传输过程:
dsVideo = createDataSource(vf);//创建视频数据源dsAudio = createDataSource(af);//创建音频数据源devices = CaptureDeviceManager.getDeviceList(format);//得到类型为format的设备的清单,存放在表devices中ds = Manager.createDataSource(ml);//通过媒体定位器创建数据源RTPTransmit rtpTransmit = new RTPTransmit(processor,ipAddr,port);//构造RTP会话result = createProcessor();// 产生一个处理器result = createTransmitter();产生RTP会话,将处理器输出的数据传给指定的IP地址的指定的端口号processor.start();// 让处理器开始传输
4.2.2 多播的详细设计
多播基本思想是一个源IP主机只进行一次发送,多个接收者(目标 IP主机)可以接收到相同数据的一个拷贝。但是多个接收者必须都注册加入同一多播组。IP多播服务是一种开放的服务模型,任何主机可以随时加入或退出某个多播组。
利用这种思想,可以实现会议中的多点对多点的视频传输,已达到组织会议的目的。多播系统结构图:
图4.4 多播系统结构图
多播实现过程:
group = InetAddress.getByName(MuiltAddr); //设置组播地址socket = new MulticastSocket(port); //创建MulticastSocket类并将端口与之关联socket.joinGroup(group); //加入此组播组
4.3 系统界面的详细设计
本系统在进行界面设计的时候考虑了系统的功能,对各功能模块进行详细合理的布局:
1. 把一些功能加到界面中的菜单中,有连接服务器,连接视频,断开连接,退出等子菜单项。
2. 在界面中添加在线用户列表框,用以显示在线的用户。
3. 在界面中用一个大的Panel 装载举行会议时的各个用户的视频框。
4. 在界面中添加实现简单聊天室功能的聊天文本框。
5. 在界面底端有一些功能按钮,如连接视频,发送信息等。
第五章 系统实现
5.1 系统开发环境
系统:Microsoft Windows XP Professional Service Pack 2
开发语言:JAVA
编程环境:Eclipse
JMF版本:JMF 2.1.1
JDK版本:JDK 5.0
Eclipse版本:Eclipse 3.2
5.2 系统实现
5.2.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);//设置阻塞模式为非阻塞模式等待一个连接
5.2.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);//读取通道中消息
5.2.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 {}
5.2.4 视音频接收
接收网络实时媒体数据流是通过java.media包中定义的各种RTP事件监听器和RTP事件处理类来处理和控制的,使用java.media包中的Player类可以实时播放网络多媒体数据流,java.media包中的处理媒体流接收和播放完成了整个接收RTP数据的过程。接收部分程序为每一种新接收到的媒体数据流产生一个播放器,一边接收媒体流数据,一边将媒体数据播放出来,其实现分为以下几个步骤:
1. 实现ReceiveStreamListener监听接口,监听NewReceiveStreamEvent事件。
2. 当接收到NewReceiveStreamEvent事件后,通过事件获取接收媒体数据流(ReceiveStream),然后通过接收媒体数据流获取RTP数据源(DataSource)。
3. 将数据源传给Manager.createPlayer()产生一个播放器。
4. 给播放器添加监听器,等到播放器实现后,即可显示播放数据。
定义以下内容:
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) {}
第六章 性能测试与分析
6.1 测试实例(测试集)的研究与选择
测试是为了发现程序中的错误而执行程序的过程。好的测试方案是尽可能发现尚未发现的错误的测试方案。
本节分别介绍各个功能的测试用例及其预期结果。
- 测试服务器的开启:
在搭建好运行环境后,运行,服务器正常连接。(如有问题时,系统抛出异常,提示开启失败对话框)
- 测试用户连接服务器:
在开启服务器之后,用户进行连接,由于开始是在寝室连接,速度比较慢,所以连接超时,抛出异常。后又在其他地方连接成功。
- 测试举行会议部分:
进行视频连接,连接成功,在视频会议过程中,视音频的传输都成功。后又请同学用黑盒法进行了测试,曾出现问题,连接中抛出异常,不能正常连接,也有的是视音频传输过程中出现了问题,但大多都是因为人为因素(摄像头或耳机等出现问题)。
- 测试聊天室部分:
在连接到服务器后,列表中显示所有上线的用户,在文本框中发送数据,发现所有的用户都能收到,证明没有问题。
6.2 性能分析
1. 系统安全性能分析
本系统具有很强安全性,能够稳定运行。在视频会议系统前端安置加密机或者直接使用加密网卡可以提高在传输过程中的安全性。加密设备可直接提供加密能力,从而实现用户的身份验证以及未经授权的数据访问和恶意侵犯。
2. 系统稳定性能分析
该系统设计的合理性保证了可靠稳定的运行,支持当前大多数硬件平台,核心线程优先保护、数据流容错的设计思路使系统可更加稳定的运转。在经过大量、多类型复杂组合反复多次测试后,系统始终运行稳定,说明系统的稳定性具有一定可信度。
第七章 课程设计总结
本系统已经完成了预期目标,并且在预期目标基础上有了一定的突破。从系统最初的可行性分析、需求分析、设计,到最后实现的过程中,经过多次反复的修改,功能逐渐完善,已经基本达到了实用,方便,人性化等预期目标,且能实现多人在线同时举行会议。
7.1 系统总结
7.1.1 系统特点介绍
1. 较完善的安全性和稳定性
本系统基于JAVA语言编写,有强大的错误及异常处理功能。支持当前大多数硬件平台,核心线程优先保护、数据流容错的设计思路使系统可更加稳定的运转。在视频会议系统前端安置加密机或者直接使用加密网卡可以提高在传输过程中的安全性。加密设备可直接提供加密能力,从而实现用户的身份验证以及未经授权的数据访问和恶意侵犯。
2.人性化设计
在考虑了多方面因素,查阅相关资料和试用其他视频会议系统后,总结并设计了人性化的界面,方便的菜单选项和按钮,便捷的视频及聊天功能,且还可以看到在线参加会议的人员,易于用户使用。
7.1.2 系统存在的问题
本系统是点对点的视频会议系统,目前可完全实现多人在线同时举行会议的功能。测试中是在小范围的局域网内进行的,可能在实际广域网中测试不会太顺利。
7.2 系统改进建议或设想
在系统改进时,可向一点对多点和多点对多点方面改进。并参考现在流行的一些视频会议系统进行改进,且做出文件传输部分。
7.3 课程设计心得体会
通过这次课程设计,不仅学到了很多专业知识,而且提高了动手能力和解决实际问题的能力,受益匪浅。
此系统已经实现了点对点视频连接,以及一些辅助功能,并且经过对功能的测试,反映良好。由于使用JAVA作为开发工具,所以在跨平台方面的优点也非常突出。在本次课程设计中学习了多媒体技术,巩固了JAVA Socket编程,更有信心进行深层次的学习,并且可以结合各方面的知识进行多方面的学习,积累更多知识。
参考文献
[1] H.M.Deitel P.J.Deitel,Java 《程序设计教程》 清华大学出版社,2004
[2] 彭波 孙一林 《Java多媒体技术》 清华大学出版社,2004
[3] 刘成德 李 祥 《基IPMulticast/JMF的多媒体网络会议系统的设计与实现》
[4] Elliotte Rusty Harold 《Java网络编程》 中国电力出版社,2005
[5] 毛黎莉 潘建国 《基于JMF的RTP应用分析与研究》
[6] 周静 邹北骥 《利用JMF 实现RTP流的传输与播放》
相关文章:
基于Java的远程视频会议系统(源码+系统+论文)
第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息ÿ…...
SAP-ABAP:FOR ALL ENTRIES IN用法详解带实例代码
在 SAP ABAP 中,FOR ALL ENTRIES IN 是 SELECT 语句中一个非常常用的功能,用于根据内表中的数据查询数据库表。它的主要作用是将内表中的数据作为查询条件,从数据库表中筛选出符合条件的数据。 1. 基本语法 SELECT <fields>FROM <d…...
构建jdk17包含maven的基础镜像
1、先拉取jdk17基础镜像 docker pull openjdk:17-jdk-alpine 2、使用jdk17基础镜像创建容器 docker run -it openjdk:17-jdk-alpine sh 或 docker run -it --name jdk17 openjdk:17-jdk-alpine sh 3、修改镜像源地址 cat /etc/apk/repositories https://mirrors.aliyun.com…...
【Android】版本和API对应关系表
目录 版本和API对应关系表 不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵! 版本和API对应关系表 版本名版本号名称APIAndroid 1616.0W36Android 1515.0V35Android 1414.0U34Android 1…...
Spring Boot 整合 JPA 实现数据持久化
目录 前言 一、JPA 核心概念与实体映射 1. 什么是 JPA? 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口? 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...
KUKA 机器人仿真——Simpro4.1和OfficeLite8.6.2 连接实现虚拟示教器
一、准备软件 1、Simpro4.1,是一机一密钥,不好破解,我在某宝买的,省事了。 2、OfficeLite8.6.2,看我的博文的第三步虚拟机内安装OfficeLite8.6.2 KUKA示教器仿真软件OfficeLite8.6.2,EthernetKRL3.1.3通信…...
IntelliJ IDEA使用经验(十三):使用Git克隆github的开源项目
文章目录 问题背景办法1、设置git代理;2、再次克隆项目;3、再次按常规方式进行git克隆即可。 问题背景 由于github在国外,很多时候我们在使用idea克隆开源项目的时候,没办法检出,提示 连接重置。 办法 1、设置git代…...
互联网大厂中面试的高频计算机网络问题及详解
前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 先来说说计算机网…...
综合实验练习实验报告
一、需求分析 1.防火墙上配置DHCP服务,完成接口配置 2.用户建立以及认证策略建立 3.安全策略建立 二、详细配置 DHCP配置 [FW1]dhcp enable [FW1]int g1/0/1.1 [FW1-GigabitEthernet1/0/1.1]dhcp select interface [FW1]int g1/0/1.2 [FW1-GigabitEthernet…...
Ubuntu22.04 配置deepseek知识库
文章目录 安装 docker配置 dify配置 ollama创建大模型 安装 docker 更新系统:sudo apt update sudo apt upgrade -y安装必要的依赖:sudo apt install apt-transport-https ca-certificates curl software-properties-common -y添加 Docker 的官方 GPG 密…...
如何在WPS和Word/Excel中直接使用DeepSeek功能
以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用:1. 下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:OfficeAI助手 - 免费办公智能AI助手, AI写作,下载…...
Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)
背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…...
jvm 线程监控调试
文章目录 前言一、使用JDK工具转储线程文件(如jstack)1. 找到Java进程的PID:2. 使用jstack生成线程转储文件:3.验证生成的线程转储文件:二、分析文件1.使用在线工具进行分析上传thread-dump文件,等待解析完成2.查看分析结果总结前言 提示:使用jdk自带工具转储线程监控文…...
超越 DeepSeek V3 -->【Qwen2.5-Max】
🔥 先说明,不是广子,不是广子!!!单纯分享这个工具给大家,毕竟最近使用 DeepSeek 太容易崩了,每天深度思考一次之后就开始转圈圈用不了,然后就找到了这个工具使用 一、前言…...
301.华为交换机堆叠技术基础
华为交换机堆叠技术基础 一、概念及原理部分1.堆叠简介1.1 什么是堆叠1.2 可靠性网络架构1.3 华为堆叠设备1.4 其他厂商的堆叠2.堆叠的示意图3.堆叠的应用3.1 中小企业3.2 园区网4.堆叠的原理4.1基本的概念4.2 堆叠建立4.3 角色选举4.4 版本同步4.5 配置同步4.6 堆叠系统的登录…...
【开源AI】AI一页一页读PDF
【开源AI】AI一页一页读PDF 可以在这里看 : 让AI 处理 PDF 文件,提取其中的知识点,并生成总结。 只是无法修改,后续若有更新在csdn这里。 【OpenAI】 API 更新: JSON 结构化输出约束机制( JSON Schema) 的一次实战。知识库的JSON Schema形式 每一页都要总结,总结的知识…...
Spring AI 介绍
文章来源:AI 概念 (AI Concepts) _ Spring AI1.0.0-SNAPSHOT中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它,以了解 Spring AI 是如何实现的。 模型 AI 模型是旨在处理和生成…...
React - 事件绑定this
在 React 中,this 的绑定是一个常见问题,尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数,当被调用时,其 this 关键字被设置为提供的…...
【3.Git与Github的历史和区别】
目录 Git的历史和Github的区别本质和功能 Git的历史和Github的区别 Git是由Linux内核的创造者Linus Torvalds于2005年创建的。当时,Linux内核开源项目使用BitKeeper作为版本控制系统,但2005年BitKeeper的商业公司终止了与Linux社区的合作,收…...
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 📫 欢迎V: flzjcsg2,我们共同讨论Java深渊的奥秘 …...
【算法学习】二分查找开区间写法总结
根据灵神教学中的二分查找开区间写法进行如下总结: 我们需要注意的是,lowerBound 模板求解的是 > target 的最小下标 private int lowerBound(int[] nums, int target) {int left -1;int right nums.length; // 开区间 (left, right)while (left …...
信息科技伦理与道德3-2:智能决策
2.2 智能推荐 推荐算法介绍 推荐系统:猜你喜欢 https://blog.csdn.net/search_129_hr/article/details/120468187 推荐系统–矩阵分解 https://blog.csdn.net/search_129_hr/article/details/121598087 案例一:YouTube推荐算法向儿童推荐不适宜视频 …...
【干活分享】2025年可以免费问答的一些GPT网站-deepseek等免费gpt
2025年已经到来,大家也都陆续回归到忙碌的工作中。在新的一年里,如何更高效地完成工作任务,提升工作效率,是很多人关心的问题。今天,就为大家分享一些实用性很强的GPT网站,帮助大家在工作中事半功倍。 Dee…...
webpack配置之---入口
entry 单入口 由于一般的单页面项目只有一个入口,也就是单入口,单入口的配置方式有以下三种方式,如果有遗漏的欢迎补充 1、字符串方式 以下这几行代码解释: entry:本项目的入口文件 output:本项目打包…...
Golang GORM系列:GORM CRUM操作实战
在数据库管理中,CRUD操作是应用程序的主干,支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性,使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南,提供了在Go应用程序中有效…...
[M模拟] lc380. O(1) 时间插入、删除和获取随机元素(模拟+数据结构+脑筋急转弯+数组快捷删除技巧+项目思考)
文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:380. O(1) 时间插入、删除和获取随机元素 题单: 待补充 2. 题目解析 其实这个题目抽象一下的话在项目中也能出现,可能日常项目中没有算法基础的话,就很容易直接去进行新内…...
30~32.ppt
目录 30.导游小姚-介绍首都北京❗ 题目 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题:考生文件夹(注意&#x…...
一键查看电脑各硬件详细信息 轻松查看电脑硬件参数
今天为大家推荐两款非常实用的电脑硬件查看软件,它们能够一键快速查看电脑的各种配置信息,使用起来非常方便。 一键查看电脑各硬件详细信息 这款软件是绿色版的,无需安装,打开即可使用,文件大小仅为900多KB࿰…...
java如何创建自定义异常?
在Java中,创建自定义异常通常需要继承Exception类或其子类。以下是创建自定义异常的基本步骤: 定义异常类:创建一个新的类,继承自Exception或RuntimeException(根据需要选择)。 构造方法:提供一…...
2025/2/10 心得
第一题。J. C - Grand Garden (AI) 问题陈述 在一个花坛里,有 NN 朵花,编号为 1,2,\ldots,N1,2,…,N。最初,所有花的高度都是 00。你将得到一个高度序列 h{h\_1,h\_2,h\_3,\ldots\} 作为输入。你希望通过重复以下“浇水”操作来将所有花的编…...
Visual Studio 2022 中使用 Google Test
要在 Visual Studio 2022 中使用 Google Test (gtest),可以按照以下步骤进行: 安装 Google Test:确保你已经安装了 Google Test。如果没有安装,可以通过 Visual Studio Installer 安装。在安装程序中,找到并选择 Googl…...
软开关和硬开关
硬开关: 电路结构相对简单,一般只包含基本的开关管、电源、负载等元件,没有专门的谐振电路来辅助开关过程。 开关管在导通或关断时,电压或电流的变化率非常快,形成急剧的开关过程。开通时,开关器件的电流…...
C++17中的std::clamp:限制值的范围
文章目录 一、背景与动机二、std::clamp的定义三、使用示例示例1:基本用法示例2:浮点数和自定义类型 四、实际应用场景1. 游戏开发2. 图形处理3. 数值计算 五、注意事项六、总结 在C17中, std::clamp是一个极为实用的算法,它能够…...
Python的
& 运算符可用于不同集合类型,它主要用于集合的交集操作 下面分别介绍它在 set(集合)和 frozenset(不可变集合)这两种常见集合类型中的使用 set 类型 set 是 Python 中内置的可变集合类型,使用 & …...
计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
13.8 聚焦应用场景的Prompt设计实战:从通用到领域专用的翻译质量跃升
聚焦应用场景的Prompt设计实战:从通用到领域专用的翻译质量跃升 关键词:领域特定Prompt设计、翻译质量优化、动态术语控制、多阶段推理链、Prompt版本管理 1. 翻译Prompt设计核心原则 1.1 领域知识深度渗透 def build_medical_prompt(): return ChatPromptTemplate.from_…...
基础入门-HTTP数据包红蓝队研判自定义构造请求方法请求头修改状态码判断
知识点: 1、请求头&返回包-方法&头修改&状态码等 2、数据包分析-红队攻击工具&蓝队流量研判 3、数据包构造-Reqable自定义添加修改请求 一、演示案例-请求头&返回包-方法&头修改&状态码等 数据包 客户端请求Request 请求方法 …...
Golang Web单体项目目录结构最佳实践
在Golang 开发Web 项目的过程中,如何组织目录结构是一项至关重要的任务。合理的目录结构不仅能提高代码的可维护性,还能为团队协作提供清晰的代码规范。 为什么要设计合理的目录结构? 在 Golang 项目中,代码的组织方式会影响开发…...
【系统架构设计师】体系结构文档化
目录 1. 说明2. 重要性3. 主要内容4. 编写原则5. 实践建议6. 例题6.1 例题1 1. 说明 1.绝大多数的体系结构都是抽象的,由一些概念上的构建组成。2.层的概念在任何程序设计语言中都不存在。3.要让系统分析员和程序员去实现体系结构,还必须将体系结构进行…...
C++性能优化—AI润色版
上接《C性能优化—人工底稿版》 C性能优化深度解析:从编码技巧到硬件协同 "过早优化是万恶之源" —— Donald Knuth 但合理的性能优化是优秀C工程师的核心能力。本文从编码实践到硬件原理,系统梳理C性能优化的知识体系。 一、性能优化的哲学…...
继承(python)
一、基础知识 (一)定义:子类能继承父类所有的公有属性和公有方法(先使用子类的方法、属性) (二)格式: class 子类名(父类名): #父类 class Ph…...
jmap使用
常用命令 jmap -heap PID jmap -histo PID | head -20 jmap -dump:formatb,fileheap_dump.hprof PID jmap 是 Java 开发工具包(JDK)提供的一个命令行工具,用于生成 Java 进程的内存映射信息。它可以帮助开发者分析 Java 堆内存的使用情况…...
Android的MQTT客户端实现
在 Android 平台上实现 MQTT 客户端的完整技术方案,涵盖基础实现、安全连接、性能优化和最佳实践: 一、技术选型与依赖配置 推荐库 Eclipse Paho Android Service(官方维护,支持后台运行) gradle 复制 // build.gradl…...
Vue.js 如何自定义主题和样式
Vue.js 如何自定义主题和样式 今天我们来聊聊如何在 Vue 项目中自定义主题和样式。无论是你想让自己的应用看起来独一无二,还是想快速适配设计稿,自定义主题和样式都是必不可少的一环。下面我将和大家分享几种常见的自定义方法和技巧。 为什么要自定义…...
强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略
目录 一、引言二、强化学习基础回顾(一)策略(二)价值函数 三、近端策略优化(PPO)算法(一)算法原理(二)PPO 目标函数(三)代码示例&…...
线上HBase client返回超时异常分析 HBase callTimeout=60000
问题现象 HBase client直接返回超时异常 HBase callTimeout=60000, callDuration=60301: row ‘12649160863966c2790195059018040900010003320’ on table ‘Z_UPA’ at region=Z_UPA,1213d1a56,1184027415643. ba7224f83dbb09591a74b7059f17., hostname=abcd,60020,891863950…...
CTF中特别小的EXE是怎么生成的
我们在打CTF时候,出题的爷爷们给出的exe都很小 就10k左右,有的甚至就5k,那时候我很郁闷啊。现在我也能了啊哈哈 不多bb按如下操作: 我们来看看正常的release生成的代码# Copy #include "windows.h" int main(){ Messa…...
Python 字典(一个简单的字典)
在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…...
爬虫技巧汇总
一、UA大列表 USER_AGENT_LIST 是一个包含多个用户代理字符串的列表,用于模拟不同浏览器和设备的请求。以下是一些常见的用户代理字符串: USER_AGENT_LIST [Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Hot Lingo 2.0),Mozilla…...
SCT2A15一款5.5V-100V 1.8A峰值电流限制 高效率非同步降压DCDC转换器,SOT23-6L封装
SCT2A15是一款异步降压转换器,输入电压范围从5.5V到100V,可适应各种降压应用,是汽车、工业和照明应用的理想选择。 SCT2A15集成了975mΩ高侧MOSFET,峰值输出电流在Vin<60V时限制为1.8A,可支持高峰值电流的应用。 SC…...