openMeetings二次开发高手的七篇文章_第1页
openMeetings二次开发高手的七篇文章_第2页
openMeetings二次开发高手的七篇文章_第3页
openMeetings二次开发高手的七篇文章_第4页
openMeetings二次开发高手的七篇文章_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

HYPERLINKOpenMeetings2010-09-2916:42:53阅读279评论0

字号:大中小

订阅作者:老猫

PhMeetings是基于开源WEB视频会议系统OpenMeetings开发的一个实验性商业版本,原始蓝本来自。老猫花了好几个月的时间,费了九牛二虎之力至今天终于完成了一个目前还算过得去的版本,沾沾自喜中……由于资料的缺乏以及对OpenLaszlo编程的陌生,其中艰辛不足为外人道。今日发一声感慨:如果你想折磨一个程序员,那就让他去干开源软件的二次开发!

好了,言归正传,先推销一下PhMeetings的演示地址:6:5080/phmeetings

参考国内流行的一些C/S架构下的网络视频会议系统,老猫的PhMeetings在OpenMeetings基础上增加了一些适合独立进行商业运营的概念和功能,同时也删减了一些不符合国内网络环境或者形同鸡肋的功能。

删除的功能有:

SIP接入网关(IPphone在国内基本用不上)

预约会议功能(这个在商业运营商很难掌控)

屏幕共享功能(除非部署在局域网环境,否则会把人急死)

取消了其它类型房间的录制功能,只保留interview类型房间内的录制功能

新增的概念或功能:

房间目录树概念:用于对房间采用树状目录管理

新增用户类型:房主。使得房间的租用概念得以商业化推广。

房间计费管理及租用到期提醒功能

新增房间管理后台功能:房主可以管理房间超级主持人、LOGO、背景、黑名单、白名单、链接及广告等。

房间收藏和房间搜索功能:方便在众多的房间中找到你想要去的。

房间锁功能:可对房间设置进入密码。

踢出房间功能:超级管理员或者房主有权在房间里将捣乱的用户踢出系统。

黑名单功能:将用户ID或者IP加入房间黑名单,该用户将被该房间拒之门外。

白名单功能:列入房间白名单的用户在房间设置密码锁时可以不必输入密码验证。

游客直接通过链接进入房间功能:房间租用者可以对游客开展产品推介或其它客服服务。

房间内显示背景、LOGO、广告及链接功能

房间欢迎语滚动显示

增加了全屏显示功能(可惜全屏时聊天的输入无法使用)

增加了视频配置里的视频帧数调节

改进的部分有:

对界面进行美化和改进

修正了移植数据库到ORACLE时的一些BUG

改进了房间的整体布局

对中文化不彻底的地方进行了完善

改进了视频的显示和布局方式

改进了摄像头采集区域的一些BUG

优化了音频和视频参数配置

增加用户默认头像的性别区分

将用户信息从firstname、lastname等西方习惯改为昵称

欢迎有兴趣的朋友注册PhMeetings参与体验。或者以游客身份直接进入OpenMeetings技术群专属房间参与讨论。OpenMeetings二次开发实例(一)游客直接进入房间OpenMeetings2010-09-2910:42:15阅读474评论1

字号:大中小

订阅作者:老猫决定写点东西,技术细节上的东西在二次开发过程中可以慢慢摸索和体会,如果要把这些改造过程中的细节都记录下来,对我这个懒人来说比较困难。作为IT行业的一个老兵,现在的兴趣已无法集中具体的代码上了,吸引我的更多的是如何设计一个系统,使它的性能和功能能符合某个领域的需求。

研究OpenMeetings已经几个月了,当初对这个项目感兴趣是因为这个项目是一个基于WEB的应用。而目前绝大部分投入实用阶段的视频会议系统都是基于C/S架构的,从CISCO的基于硬件的专业化视频会议系统,到新浪UC、9158等开放的视频聊天或KTV系统,都必须安装客户端甚至专用硬件。而OpenMeetings的特点是它把前台构筑在Flash的基础上(客户端被编译成了一个swf文件),如此,只要客户的机器的浏览器安装了FlashPlayer插件,就可以毫无障碍地运行起来。碍于Flash对于webcam的视频和音频的实时采样压缩和传输的能力,目前在性能上,OpenMeetings还无法与C/S架构的视频会议系统相比。但OpenMeetings的先天优势在于它的完全B/S架构,使得它可以无缝地与网站相衔接。

我们设想一些网络应用,比如企业的产品推广或者网上店铺的商品展示,它们的目标对象大部分不是固定的,而是随机的游客。采用传统的视频会议系统,需要下载安装客户端并且注册登录等一堆操作,对于只是路过的游客来说,99%是不可能做这些的。假如我们只需要一个链接填写一个昵称就能进入到一个视频会议房间,该房间里有值班的客服,随时可以为你通过视频、白板等推介商品,那么至少有一半以上的游客是乐意这么做的。

我们设想的这个商业应用,很关键的一个环节是不需要注册和登录等等环节,也不需要用户熟悉这个系统或者去搜索某个房间的入口,而是通过网站上的某个链接地址点击直接进入指定的房间。比如某个网购门户,每个商家都在OpenMeetings拥有一个产品推介房间,那么它的店铺内就显示一个直通该房间的链接,游客点击该链接,系统要求用户输入一个昵称后就直接将用户重定向到该房间内由房间值班员和用户进行视频互动。

OK,我们就把这个应用当作一个方向来改进和设计OpenMeetings。那么今天的这篇文章,就来讲述一下如何在OpenMeetings上实现一个游客直通房间的功能。

首先,我们设计一个类,这个类用户实现游客的登录名的自动生成。系统接受游客时需要自动为游客生成一个登录名(loginname),我们可以把它涉及成guestXXXXXX的形式,XXXXXX的号码是从0~999999之间顺序生成的。

publicclassGuestNumManagement{

privatestaticGuestNumManagementinstance=null;

privatelongcurrentNum=0;

privateGuestNumManagement(){

}

publicstaticsynchronizedGuestNumManagementgetInstance(){

if(instance==null){

instance=newGuestNumManagement();

}

returninstance;

}

publiclongnextNum(){

if(currentNum>999999){

resetNum();

}

longn=currentNum++;

returnn;

}

publicvoidresetNum(){

currentNum=0;

}}

接下来,我们仿照OpenMeetings的SOAP接口来实现一个servlet,这个servlet接收房间号、游客的昵称和性别,然后调用SOAP接口组装成一个直接进入房间的url,并且将用户浏览器重定向到这个url。

publicclassDirectGatewayextendsHttpServlet{

privatestaticfinalLoggerlog=Red5LoggerFactory.getLogger(DirectGateway.class,"phmeetings");

protectedvoidservice(HttpServletRequesthttpServletRequest,

HttpServletResponsehttpServletResponse)throwsServletException,

IOException{

httpServletRequest.setCharacterEncoding("utf-8");

httpServletResponse.setContentType("text/html;charset=utf-8");

httpServletResponse.setCharacterEncoding("utf-8");

try{

//获得房间ID

Stringroomid=httpServletRequest.getParameter("roomid");

if(roomid==null){

PrintWriterout=httpServletResponse.getWriter();

out.println("未获得roomid,请检查参数!");

out.flush();

out.close();

return;

}

if(roomid.equals("")){

PrintWriterout=httpServletResponse.getWriter();

out.println("房间ID不能为空且必须是一个整数!");

out.flush();

out.close();

}

Longroom_id=null;

try{

room_id=Long.parseLong(roomid);

}

catch(Exceptione){

PrintWriterout=httpServletResponse.getWriter();

out.println("房间ID必须是一个数值!");

out.flush();

out.close();

return;

}

//检查是否有该房间

Roomsroom=Roommanagement.getInstance().getRoomById(room_id);

if(room==null){

PrintWriterout=httpServletResponse.getWriter();

out.println("指定的房间不存在或已被删除!");

out.flush();

out.close();

return;

}

//获得昵称

Stringnickname=null;

Integersex=newInteger(0);

try{

nickname=httpServletRequest.getParameter("nickname");ameter("sex");

if(sSex==null||sSex.equals("")){

sex=null;

}else{

sex=Integer.parseInt(sSex);

}

}

catch(Exceptione){

//...

}

//生成用户名,格式为guestXXXXXX

Stringusername=null;

//获得新序号

longnum=GuestNumManagement.getInstance().nextNum();

username="guest"+Long.toString(num)+"~";

//~符号表示为游客

//第一步,获得session

SessiondatasessionData=MainService.getInstance().getsessiondata();

StringsessionId=sessionData.getSession_id();

//第二步,登录用户

Usersuser=room.getUser();

//扩展登录方法,使得直接用MD5比对

Objectobj=Usermanagement.getInstance().loginUserEx(sessionId,user.getLogin(),null,false,null);

LongreturnVal=newLong(-1);

if(obj==null){

returnVal=

newLong(-1);

}

StringobjName=obj.getClass().getName();

if(objName.equals("java.lang.Long")){

returnVal=(Long)obj;

}else{

returnVal=newLong(1);

}

if(returnVal!=1){

PrintWriterout=httpServletResponse.getWriter();

out.println("房主授权验证失败!");

out.flush();

out.close();

return;

}

//第三步,获得Hash

Longusers_id=Sessionmanagement.getInstance().checkSession(sessionId);

Longuser_level=Usermanagement.getInstance().getUserLevelByID(users_id);

returnVal=newLong(0);

//验证房间人数

if(room.getCurrentusers()!=null){

if(room.getCurrentusers().size()>=room.getNumberOfPartizipants()){

//房间已满

returnVal=newLong(-1001);

}

}

//其它验证:是否加锁、IP地址是否列入黑名单

//...

if(returnVal==0){

//更新session里的数据

RemoteSessionObjectremoteSessionObject=newRemoteSessionObject(username,nickname,sex,

"","",null,"");

XStreamxStream=newXStream(newDomDriver("UTF-8"));

xStream.setMode(XStream.NO_REFERENCES);

StringxmlString=xStream.toXML(remoteSessionObject);

log.debug("xmlString"+xmlString);

Sessionmanagement.getInstance().updateUserRemoteSession(sessionId,xmlString);

Stringhash=SOAPLoginDAO.getInstance().addSOAPLogin(sessionId,room_id,

false,false,false,null);

if(hash!=null){

//重定向

Stringwebroot=ScopeApplicationAdapter.webAppRootKey;

//调试使用

//httpServletResponse.sendRedirect("/"+webroot+"/maindebug.lzx?secureHash="+hash+"&lzproxied=solo&lzr=swf8");

//正式

httpServletResponse.sendRedirect("/"+webroot+"/main.swf8.swf?secureHash="+hash+"&lzproxied=solo");

}

else{

returnVal=newLong(-1);

}

}

if(returnVal!=0){

PrintWriterout=httpServletResponse.getWriter();

if(returnVal==-1001){

out.println("房间已满,请稍后再试!");

}

else{

out.println("未知错误!");

}

out.flush();

out.close();

return;

}

}catch(Exceptioner){

log.error("ERROR",er);

System.out.println("Errorexporting:"+er);

er.printStackTrace();

}

}}

需要提一下的是,上述代码中,在第二步时,我使用了一个loginUserEx的方法,这个方法是我自己的扩展的,目的是把从原有的基于管理员的用户验证改成基于房主的身份验证。room.getUser()方法也是扩展的,即获得房间的房主用户,然后使用loginUserEx来验证。读者可以仍然使用loginUser的方法来代替loginUserEx,但这里必须使用管理员的登录名和密码。

接下来,我们再来设计一个输入用户昵称的页面,让用户点击链接后先在该页面输入昵称和性别再由该页面将数据提交给上面的servlet。文件:

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%Stringroomid=request.getParameter("roomid");if(roomid==null){

//重定向到注册登录

response.sendRedirect("/index.jsp");}

%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html>

<head>

<title>OpenMeetings游客入口</title>

</head>

<body>

普惠天下网页视频会议

游客入口<br>

<formname="UserInfo"method="post"action="/DirectGateway">

<tableborder="1">

<tbody>

<tr>

<td>昵称:</td>

<td><inputtype="text"name="nickname"value=""/></td>

<td>需填写</td>

</tr>

<tr>

<td>性别:</td>

<td>

<selectname="sex">

<optionvalue="1"selected="selected">先生</option>

<optionvalue="0">女士</option>

</select>

</td>

<tdcolspan="3"align="center"><inputtype="submit"value="进入房间"/></td>

</tr>

</tbody>

</table>

<inputtype="hidden"name="roomid"value="<%=roomid%>"

/>

</form>

<ahref="/index.jsp"target=_blank>登录注册入口</a>

</body></html>

OK,一个让游客直通房间的功能完成了。让我们来测试一下。输入房间链接:

http://localhost:5080/openmeetings/direct.jsp?roomid=2

然后,输入你的昵称,点“进入房间”,等待几秒到十几秒钟,好了,你被瞬移到房间内了。

附:我的OpenMeetings改造作品演示地址:6:5080/phmeetings

OpenMeetings群专用会议室游客入口:6:5080/phmeetings/direct.jsp?roomid=7OpenMeetings二次开发(三)OpenLaszlo基础OpenMeetings2010-09-2817:34:03阅读306评论0

字号:大中小

订阅作者:老猫3.1OpenLaszlo的前世今身OpenLaszlo在国内应用并不广泛,但在国外,它是一个与Flex并驾齐驱的主流的开源RIA构建平台。OpenLaszlo的前身是LPS(LaszloPresentationServer),由LaszloSystems公司在2002年发布,LPS是那个时代诞生的第一个RIA产品。根据市场和用户的需要,LaszloSystems公司于2004年在CPL协议下发布了LPS的开源产品OpenLaszlo。

OpenLaszlo的最新版本是,支持Ajax(DHTML)和Flash8、Flash9。其代号是orbit的版本是Sun和LaszloSystems公司共同开发的产品,目的是能让OpenLaszlo程序运行在包括J2ME在内的任何Java平台上,比如移动电话、PDA、电视机顶盒、打印机,等等。

3.2OpenLaszlo相比Flex的优势?

它是开源的(CPL协议)?

基于开发者熟悉的技术(JavaScript、XML)。?

支持DHML方式。

OpenLaszlo编程入门非常简单,大部分的语法与JavaScript一致,整体的结构遵循XML原则。对于一个Web前台工程师来说,和它平时的工作没有太大区别,只要熟悉了几个基本概念,如canvas、class、layout等,就马上可以上手。当前,OpenLaszlo带有丰富的控件库和类库,要熟悉和使用好这些东西,却需要狠很地花上一番功夫。3.3OpenLaszlo的框架

OpenLaszlo的SDK包括:

一个Java写的编译器

一个JavaScript的运行库(Runtime)

一个运行应用程序的附加的Servlet(可选)

3.4OpenLaszlo的编译3.4.1编译原理?

OpenLazslo编译器将LZX源文件编译成目标运行环境(runtime)下的可执行二进制文件?

OpenLaszlo目前的目标环境是:?

Flashplayer8?

Flashplayer9?

DHTML

3.4.2编译过程发生了什么??

XMLUI编译?

把lzx文件中用XML描述的用户界面(UI)编译成在Flash下可执行的swf字节代码或者DHML。?

ECMAScript编译?

把lzx文件中用ECMAScript表示的带有方法和事件句柄的用户界面类和实例编译成优化的字节代码。?

媒体、数据和字体编译?

转换PNG、JPG,GIF,SWF,MP3和TrueType字体文件,并把它们嵌入到应用对象文件(仅用于swf)。?

SizeProfiling?

Html报告应用程序的大小

3.4.3编译模式和服务器框架

代理方式(Proxied)

SOLO方式

3.5OpenLaszlo客户端框架

OpenLaszlo-RuntimeLibrary(LFC)

组件(Components)

一个丰富的UI组件库

布局(Layout)

多样化的布局管理器管理,当UI组件的尺寸发生变化时能自动调整UI组件的位置。

动画(Animation)

通过使用声明的动画系统,为所有UI部件提供可声明的或可编程的动画,为高质量的动画设计带来自动化的易入易出体验。

约束(Constraints)

可声明的约束系统,在数据源的值改变、其他用户接口组件的属性值改变、或者用户事件发生时,能够自动更新用户接口的属性。

数据绑定(Databinding)

可以从XML数据集自动填充用户接口组件值,可以生成多个组件的副本来匹配多个数据值。

XMLServices

HTTPrequestsforXML

SOAP

XML-RPC

JavaRPCservices.

调试(Debugging)

附带一个嵌入式的命令行调试器,可以在运行时显示警告和日志信息,并且可判读应用程序中ECMAScript脚本的上下文表达式。

3.6部署模式

Proxied代理方式

代理模式部署应用程序可以做到SOLO模式做不到的更多的事情,但是部署起来更加麻烦,很多时候执行起来比较慢。

SOLO方式

SOLO更易于部署,执行效率也更高。

3.7工作流—天气预报典型应用

3.8不足

没有一个很好的集成开发环境(IDE)。目前在Eclipse下开发Laszlo应用有两种选择:

LaszloIDE插件

Spket插件。

前者已经停止了维护,而后者对Laszlo的支持与FlashBuilder相比较的话,仍然任重道远。

无法在IDE环境下做到UI的所见即所得,或者在IDE环境下直接获得编译错误;

缺乏断点调试等方便的调试手段;

与商业软件Flex相比,参考资料和书籍缺乏。OpenMeetings二次开发(二)RED5简介HYPERLINKOpenMeetings2010-09-2817:11:17阅读161评论0

字号:大中小

订阅作者:老猫

前文介绍过,OpenMeetings的后台是在RED5的基础上开发的。因此OpenMeetings的框架与RED5一脉相承,不可分割。OpenMeetings的二次开发中,负责编写后台的工程师必须对RED5有所了解,并且理解其基本概念及其框架。

在此,整理了一些相关RED5的基础介绍以及开发RED5应用时必然会涉及的一些基本概念,希望对朋友们们有所帮助。2.1挑战FMS

在介绍RED5之前,有必要先介绍一下FlashMediaServer:

FlashMediaServer,简称FMS,是Flash大家庭里的一员,被称为是目前开发Web音视频应用程序(比如,视频聊天室、视频会议系统、播客系统、音视频留言等等)的最方便最快捷的解决方案。也在web应用程序开发上有着越来越广泛的应用。

典型应用:YouTube、土豆网

FMS如此的优良功能当然并不是免费提供给广大用户的,几千美金每个点的价格让很多开发人员望而却步。于是,开源的Red5成为人们的新宠。

2.2RED5-穷人的流媒体服务器

Red5是一个采用Java开发的开源的Flash流媒体服务器,功能上与FMS类似。它支持:

把音频(MP3)和视频(FLV)转换成播放流;

录制客户端播放流(只支持FLV);

共享对象;

现场直播流发布;

远程调用。

Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中实现了

在线录制

flash流媒体播放

在线聊天

视频会议

2.3RED5中的几个个重要概念和模型2.3.1scopeRed5中,所有资源形成一颗树,每一个节点被称为scope,如果该节点是个叶子节点,那它被称为BasicScope,如果该节点还有子节点,那它被称为Scope。Red5里有两种预先定义好的BasicScope:SharedObjectScope和BroadcastStreamScope。

每一个应用都有自己的Scope等级体系,根就是WebScope(即此应用的实例)。Red5定义了一个全局scope意在提供一个通用的资源供各个应用共享,称之为GlobalScope。GlobalScope是所有的WebScope的父节点,其余的中间scopes都是Scope的实例。每一个scope有一个名称。GlobalScope的名称是:default。每一个WebScope的名字就是该应用上下文的名称。中间的Scope的名字就是它所在路径的名称。SharedObjectScope的名字就是SharedOjbect的名字,BroadcastStreamScope的名字就是Stream的名字。

除了GlobalScope和BasicScopes外,其余scope都可以被一个client连接。一个客户端请求连接的结果会被用来创建一个Scop对象.例如:一个客户端请求一个连接来连oflaDemo/room0,而此时room0的scope并未存在,当创建了这个连接后,room0的scope被创建了,如果请求的url里包含了中间多个scope,所有的scope都会相应地被创建。比如:url为:oflaDemo/lobby0/room0,此时room0和lobby0都不存在,那他们都会被相应的创建,然后,连接指向了room0这个scope。2.3.2context

一个Context是和一个Scope对象绑定在一起的,它用来给scopeobject提供额外的功能.Context对象可以通过IContext.getScope()来获得.Context包装了spring的applicationcontext,因此,spring里声明的各种bean在此都可以使用.

Context可以被继承.这就是说一个Scope可以继承它的父节点的Context而无需自己在定义一个context,只有GlobalScope和WebScope必须使用它们自己的Context对象.“Scopes”和“Contexts”是开发red5重要概念。

每个application在Red5中仅仅只有一个Context。Context类实现了接口IContext。context实例对象由JavaSpringframework初始化,它提供作用路径映射和不同服务接口。每个application只有一个context和一个WebScope,WebScope的名称和context的路径配置相关,它们名称虽相同但意义不同。2.3.3application利用red5创建的任何应用常常都和“application”有关,applications是建立在flash客户端和red5服务之间以任何形式交互的基础和基本概念。术语"application"来源于FlashMediaServer(FMS),Adobe研发用于和flash客户端通信的软件。red5使用更复杂模式来处理flash客户端的请求,red5使用类似于搭积木组合方式来模拟FMS

的application“概念;简而言之,如你在red创建以一个"application",那么同时创建了一个WebScope

(scope的一种)、一个Context和一个handler。树的根-RootScope-存在于所有的applications当中(所有的applications都可以访问),RootScope代码命名为"default",它是类GlobalScope的一个实例主要为applications提供通用的共享资源。RootScope隐含为其他Scope之上的Scope,也就说不能被任何连接的客户端直接命名。RootScope直接下级scope是一系列特别的scopes,每一个scope代表了red5服务器运行的一个application,这些scope命名和application上下文命名一致,这些scope是类WebScope的一个实例,因为这些scope命名和application上下文命名一致导致很难区分它们,事实上他们是完全不同的两个东西。WebScope下面的节点,稍微有些不同,每一个WebScope被运行它的

red5服务器显示的定义;每一个WebScope拥有自己的配置文件,并且可以看做是独立的application。如果想创建WebScope作用域你需要在red5下创建

application目录和配置文件。在WebScope下创建指定的作用域,指定的作用域就会被动态的创建(如果指定作用域没有被创建)。例如,假如没有一个应用没有创建“myApp”的作用域。某个flash客户端连接到"rtmp://red5serverHostname/myApp/aaa/bbb/ccc"

red5会检查"aaa"是否已经存在,如果不存在就创建"aaa"作用域,同理"bbb"和"ccc"。每一个WebScope

之下的动态作用域命名和给定的连接路径名称一致,例如上面的例子,作用域的名称分别是

'aaa','bbb',和'ccc'。这些作用域分别由Scope类或者BasicScope类来实例化。没有子节点的叶子节点通常由BasicScope类实例化,非子节点由Scope类实例化。这些作用域都为flash客户端提供功能调用,但是当flash客户端连接到叶子域时,叶子域提供更有用的功能调用。例如,"ccc"域可以提供在线流连接或者"sharedobject"连接,并允许多个flash客户端数据共享。2.3.4Handler

现在,我们有了如何让flash客户端怎样去连接的scope系统,有了来映射作用域请求的context,和服务应用代码。这些代码位于Handler。handler

是red5application主要功能的实现,它实现了客户端连接和断开连接的方法,实现了客户端远程调用(RPC)的方法。application的初始化入口是从实例化WebScope

类开始的。当客户端连接这个application,red5需要调用WebScope类多个方法来初始化。因此application'shandler需要实现IScopeHandler接口,这个接口定义red5必须要调用的方法。handler由这些开发red5应用的创建,通常也需要扩展red5已经实现的ApplicationAdapter类或者MultiThreadedApplicationAdapter类,这些类已经实现了基本的handler功能,并且实现了必须实现的IScopeHandler接口。OpenMeetings二次开发(一)OpenMeetings基础HYPERLINKOpenMeetings2010-09-2817:02:39阅读180评论0

字号:大中小

订阅作者:老猫1.1OpenMeetings概述OpenMeetings是一个多语言可定制的视频会议和协作系统。它支持音频、视频,能让你查看每个与会者的桌面。OpenMeetings还包含一个白板,通过白板可以导入各种格式的图片和涂鸦。OpenMeetings开发团队由来自全球各地的28位成员组成,具有很强的技术实力,团队负责人seba.wagner同时还是另一个重要开源软件RED5的核心维护者。

OpenMeetings是一个优秀的开源项目,当然更加优秀的是支撑它的另两个开源项目:一个是大名鼎鼎的号称穷人的流媒体服务器的RED5;另一个同样也是RIA开发的顶梁柱之一:OpenLaszlo。1.2OpenMeetings组成

Openmeetings是一款基于Flash的多语言可定制的开源(EPL)视频会议软件,通过RTMP和HTTP协议传送视频数据。支持在线聊天,视频,文件共享,桌面共享。它还包含一个白板,通过白板可以导入各种格式的文档、图片和涂鸦。

客户端用OpenLaszlo开发,在Flashplayer环境下运行。

服务器端采用Java开发,采用了Spring和Hibernate框架。

流媒体服务基于开源软件Red5。

其它的第三方辅助软件:

OpenOffice:文档转换

ImgMagic:图像处理

GhostScript:阅读开放性文档

SWFTools:将pdf文档转为flash格式在白板中播放

FFMpeg:录制、转换和流化音频和视频

1.3OpenMeetings与传统的视频会议相比的优势

基于浏览器的网页视频会议系统;

客户端电脑只需Flash插件;

无需下载安装任何客户端;

入口可嵌入客户的企业网站;

实现视频会议、电子白板、文字聊天、文档转换和共享、屏幕共享、视频录制、后台管理等功能;

具备会议室、聊天室、面谈室等多种房间配置;

可建立公共房间、私有房间、个人房间、预约房间等多种房间模式。

1.4OpenMeetings的特点

完全开源的系统

组建一套OpenMeetings,可以选择从操作系统(Linux)到数据库(MySQL)到流媒体服务器(RED5)到辅助软件(OpenOffice、FFMpeg等)到开发环境(OpenLaszlo、Eclipse)等完全开源的系统。

跨平台,支持多种数据库?

WIN32、Linux、MacOS?

MySQL、Postgres、ORACLE、DB2?

国际化

与各种第三方应用整合,扩展性强?

SIPPhone网关?

SingleSignOn?

LDAP1.5功能

1.6后台管理

组织管理

连接管理

房间管理

用户管理

国际化语言管理

系统配置管理

数据备份管理1.7平台框架

1.8开发环境搭建

源代码下载:

JRE

基本IDE:Eclipse/MyEclipse

插件:SVN,Spket

第三方支持:,FFMpeg,SWFTools,ImageMagic,SoX1.9系统模型

上图的模型中,OpenMeetings的后台是一系列的service组成的,这些service由Java语言编写,这些service的实现类大都在包中,该包封装了大部分前后台交互的类。如文件服务、用户服务、会议服务、流服务等等。

前台是由OpenLaszlo编写lzx文件,编译完成后是一个Flash的形式(swf文件)。前后台的交互大部分通过RPC调用实现,即OpenLaszlo程序远程调用后台的Java类,也有部分回调。OpenLaszlo中RPC调用的实现可以参阅OpenLaszlo的开发指南。

前后台的交互也有少部分是通过http协议完成的,比如图片的上传和现实,文档的上传等等。这一部分与传统的B/S架构是类似,后台是Java语言编写的servlet,这些servlet位于包。1.10技术体系层次OpenMeetins音视频参数设置及优化HYPERLINKOpenMeetings2010-09-2710:33:16阅读142评论0

字号:大中小

订阅作者:老猫一、前言OpenMeetings是一个基于Flash视频的视频会议系统,它的后台是基于开源的流媒体服务器RED5做的二次开发,而前台实质上是一个采用OpenLaszlo开发的Flash。也就是说,OpenMeetings的客户端必须运行在Flash环境下。因此,我们不妨把PC机上的FlashPlayer看作是一个OS(操作系统),而把OpenMeetings的前台(swf文件)当作该操作系统下的一个可执行程序。这样的思路下,我们就可以理解,就如我们在Windows下开发依赖于硬件的应用程序时必须要借助WINDOWSAPI的支持一样,OpenMeetings的客户端也极度依赖Flash环境所能提供的功能和性能,尤其是和音频视频相关的地方。

二、OpenMeetings流媒体采集和编码Flash视频的客户端采集视频和音频信号后由Flash插件完成音视频编码,编码算法是封闭的,据说采用的编码协议是(视频编码为),应用开发者无法优化这一块。OpenMeetings调用摄像头时并创建一个广播流时,我们来看看Flash做了哪些动作:

捕获摄像头信号

进行视频压缩编码

创建一个基于RTMP协议的流与RED5建立连接

将经过视频压缩编码后的数据按照RTMP协议进行信道编码

将信道编码后的数据放入流中

我们可以发现,Flash自动帮我们完成了大部分的工作,所以开发基于Flash的流媒体应用是一件相当轻松愉快的事情。然而,事物总是具备两面性的,Flash的封闭性使我们无从着手改进音视频的压缩编码算法,更谈不上改进RTMP协议传输协议。能改善性能的地方都被牢牢地封闭在黑箱子里,就好比我们要参加汽车节油比赛时,却发现手里只有一辆纯自动档的汽车,让你空有一身车技却无用武之地时,郁闷更是无与伦比。

三、OpenMeetings公网上应用的带宽瓶颈在国内,大多数家庭用户和中小型企业接入都采用ADSL线路。我们知道,ADSL是一种不对称线路,即下行带宽大,而上行带宽很小,大约只占下行带宽的四分之一。512K的ADSL线路,上行带宽大约为128Kbit,即不到20KB的码流。OpenMeetings默认用户视频设置参数为30帧/秒(FPS)、分辨率为320*240、质量为90,要求稳定的上传带宽为50KB左右,如果再加上10Kb~20Kb的音频信号,就要求在50KB~70KB的上行码流才能无损地向其它用户广播。

Flash对于音频采集和编码的效率也很一般,采样速率为22K时,其音频压缩编码后的码流速率一般为10KB;采用默认采样率为44K时,码流速率为16KB左右。也就是说,512K的ADSL线路仅能保障较高质量的音频要求。

两者的差距巨大,因此,如果按照OpenMeetings的默认设置部署在公网上,很多用户会感觉到别人的视频或音频非常卡,不流畅。其实这大多数情况不是你网络接收的问题,而是视频发布者的上行带宽不能适应系统的要求。我们知道,在网络上,流媒体数据一般是采用UDP协议来传输的,UDP协议比TCP的开销小,但更容易丢帧,其接受的数据包也不是顺序的,一旦由于带宽的问题导致客户端很长时间无法收全一个视频基帧数据,那么视频就会停顿,俗话叫卡死。

这样的性能在国内极其不稳定的网络条件下实在是差强人意,同时,前文也提到,我们无法去动它的编码算法,那么为了使OpenMeetings能适应国内大多数的512kadsl拨号上网线路,我们只能在音频视频的设置上下功夫,在保证音频和视频的质量勉强可以让人接受的前提下,来建立一个较为流畅的系统。

四、优化视频和音频参数以适应网络环境OpenMeetings音视频信号采集和压缩编码相关的参数信号都可以在它的系统配置文件中找到,其中音视频相关的部分如下:

<!--CameraSettingsfortheFramesPerSecond

fps:Number[optional]-Therequestedrateatwhichthecamerashouldcapture

data,inframespersecond.Thedefaultvalueis15.

-->

<framesPerSecond>30</framesPerSecond>

<!--CameraSettingsfortheBandwidth:

bandwidth:Number[optional]-Anintegerthatspecifiesthemaximumamount

ofbandwidththatthecurrentoutgoingvideofeedcanuse,inbytespersecond.

TospecifythatFlashvideocanuseasmuchbandwidthasneededtomaintain

thevalueofframeQuality,pass0forbandwidth.Thedefaultvalueis16384.

--><!--ThesearethesettingsfortheQuality-Modus*normal*

TheQuality-ModuscanbechosenintheLogin-Box--><bandwidthNeededNormal>16384</bandwidthNeededNormal>

<!--ThesearethesettingsfortheQuality-Modus*best*-->

<bandwidthNeededBest>49152</bandwidthNeededBest>

<!--CameraSettingsfortheQuality

quality:Number[optional]-Anintegerthatspecifiestherequiredlevelof

picturequality,asdeterminedbytheamountofcompressionbeingappliedto

eachvideoframe.Acceptablevaluesrangefrom1(lowestquality,maximum

compression)to100(highestquality,nocompression).Tospecifythatpicture

qualitycanvaryasneededtoavoidexceedingbandwidth,pass0forquality.

Thedefaultvalueis0.

--><!--ThesearethesettingsfortheQuality-Modus*normal*-->

<camQualityNormal>85</camQualityNormal>

<!--ThesearethesettingsfortheQuality-Modus*best*-->

<camQualityBest>90</camQualityBest>

<!--MicrophoneSettingsfortheRate:

rate:Number-

Therateatwhichthemicrophoneshouldcapturesound,inkHz.

Acceptablevaluesare5,8,11,22,and44.

Thedefaultvalueis8kHzifyoursoundcapture

devicesupportsthisvalue.Otherwise,thedefaultvalue

isthenextavailablecapturelevelabove8kHzthatyoursound

capturedevicesupports,usually11kHz.

--><!--Quality-Modus*normal*--><microphoneRateNormal>22</microphoneRateNormal><!--MicrophoneSettingsQuality-Modus*best*-->

<microphoneRateBest>44</microphoneRateBest>

framesPerSecond:视频信号每秒的帧数,FPS

bandwidth:带宽要求(单路视频的带宽)

camQuality:每个视频帧信号压缩后的质量,无压缩的视频质量为100%microphoneRate:麦克音频信号的采样率

在OpenMeetings中,我们必须根据用户的线路特点来设计默认的音频视频参数,才能使大多数用户能在一个相对流畅的条件下参与视频会议,前文已经大致介绍了视频分辨率、音频采用率、FPS与数据码流的关系,下面我们列出几个典型配置所需的带宽(经验值):

视频分辨率320*240,音频采用率44k,FPS30,带宽56KB+16KB

视频分辨率240*180,音频采用率22k,FPS15,带宽32KB+10KB

视频分辨率160*120,音频采用率22k,FPS5,带宽16KB+10KB

如果我们采用的设置与实际线路的上行带宽不一致,会出现什么情况呢?我们分析的结果以及实际测试的结果是一致的,即延时会越来越长,直到超过了缓冲,然后直接出现大跨度的跳帧,然后又开始延时,周而复始。

在做二次开发的时候,我们尝试着将默认的FPS参数改为5,并且在客户端让客户可以根据自己的线路状况调节。将默认的视频分辨率设置为240*180,同时提供320*240和160*120高低两种选择;另外,将音频采样率默认为22K,同时提供44K和11K两种选择。

经过这样的改造后,基本可以满足各种线路的接入带宽要求。即使最差的512KADSL线路,选用最低的设置也能和其它线路的用户比较流畅地视频和音频交互。五、OpenMeetings的延时和RED5缓存

上一节提到,OpenMeetings的延时主要是音视频质量与带宽不匹配或者线路质量原因引起的。同时,它也和RED5的缓存设置存在一定的联系。我们知道,RED5缓存的设置有助于改善视频和音频质量,比如设置一定的接收缓存,可以将客户端上行的UDP数据包更好地组装,最终使得转发的数据更完整。但缓存过大,在网络接入状态不稳定的时候,会使系统延时逐渐增加,最好因为不同客户端的同步原因而不得不丢弃部分数据,直接造成跳帧。因此,我们的建议是,根据部署的环境及大部分用户的接入线路来设置RED5的缓存。如果我们部署在较好的网络环境下,如局域网,或者用户的接入线路大部分都是光纤线路,我们可以设置比较小的缓存,以避免延时造成的困惑。而在线路状况不佳的情况、音频视频丢帧或失真比较严重,不妨设置比较大的缓存,以改善质量。

RED5的缓存参数设置文件:/red5/conf/red5.properties。红色字体部分时相关的缓存设置参数。

#RTMP

rtmp.host=

rtmp.port=1935

rtmp.event_threads_core=16

rtmp.event_threads_max=64

#eventthreadsqueue:-1unbounded,0direct(noqueue),nboundedqueue

rtmp.event_threads_queue=0

rtmp.event_threads_keepalive=60

rtmp.send_buffer_size=200rtmp.receive_buffer_size=200rtmp.ping_interval=5000

rtmp.max_inactivity=60000

rtmp.tcp_nodelay=true

六、OpenMeetings对虚拟视频MvBox的支持问题

Flash对虚拟视频MvBox的支持有点Bug,这个问题主要出现在FireFox中,很容易引起整个Flash的崩溃。经过多次试验,发现FlashForFireFox的版本只有在视频分辨率设置宽高比为4:3时才不会引起崩溃。

七、后记与当前C/S架构下的视频会议普遍采用或者MPEG4编码的情况相比,Flash对Webcam视频的编解码已大大落后了,从带宽和画质目前都无法和C/S架构相比。当然,从发展的角度来讲,FMS和RED5都已经相继开始支持编码,Adobe也推出了自己的支持的编码器可用于和FMS或RED5配合实现高质量的直播,看来在视频会议的webcam采集和编码上将来也应该会支持,这将会给OpenMeetings真正在公网上进入实用阶段打下坚实的基础,但愿这个将来不会太遥远。使用SOAP网关实现OpenMeetings与其它系统的整合HYPERLINKOpenMeetings2010-09-2710:28:49阅读216评论2

字号:大中小

订阅作者:老猫一、概述

非常遗憾的是,OpenMeetings没有提供基于第三方SSO(单点登录,例如CAS)系统的集成方法。但它提供了一个WebService,官网将其命名为SOAP-Gateway,亦即一个基于SOAP的网关。这个Gateway集成了一系列的方法,可以实现从OpenMeetings的Flash客户端(前台)之外完成登录、进入房间、以及部分后台管理(如添加房间、注册新用户等)功能。

调用SOAP-Gateway的前提是你必须知道一个OpenMeetings管理员的登录名和密码。对于调用该WebService来进行平台管理的应用,这看起来是合理的;但对于那些只是需要让一个游客直接

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论