首页 WebRtc-Freeswitch搭建视频通话

WebRtc-Freeswitch搭建视频通话

举报
开通vip

WebRtc-Freeswitch搭建视频通话webrtc.chatdemo/chatdemo中期报告.docWebRTC项目中期报告1、成员分工赵书剑负责主要的开发和界面美化工作,其他项目成员主要负责项目测试和bug报告工作。2、项目架构本项目后台采用nodejs开发,用express进行路由转发,ws进行websocket通讯,webrtc.io来提供前端后台的webrtc连接服务。前端主要采用bootstrap做界面美化,可能还需要加入一些js库比如cluster.js做一些细节上的美化。SHAPE\*MERGEFORMAT运行本项目需要安装nodejs...

WebRtc-Freeswitch搭建视频通话
webrtc.chatdemo/chatdemo中期 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 .docWebRTC项目中期报告1、成员分工赵书剑负责主要的开发和界面美化工作,其他项目成员主要负责项目测试和bug报告工作。2、项目架构本项目后台采用nodejs开发,用express进行路由转发,ws进行websocket通讯,webrtc.io来提供前端后台的webrtc连接服务。前端主要采用bootstrap做界面美化,可能还需要加入一些js库比如cluster.js做一些细节上的美化。SHAPE\*MERGEFORMAT运行本项目需要安装nodejsv0.8.15以上,通过npminstall和bowerinstall安装相关依赖之后直接nodeapp.js就可以成功运行程序,程序监听的端口是8000,ws通讯采用的端口是8000和8001。1.view:页面采用express默认的jade引擎生成html代码,index.jade页面继承自layout.jade,大众聊天室的页面是rtc.jade2.routers:路由转发主要负责在浏览器地址栏输入地址后台解析请求然后把html页面发送给客户端。3.public:前端的css和javascript客户端核心代码:chat.js、clienit..js工具类:chatLib.js、zTool.js、DateUtil.js通讯类:webrtc.io.js、webrtc-client.js4、components和node_modules全部是项目中依赖的库文件3、详细解释大众聊天室部分将整个的聊天过程拆分成6个事件:登陆、退出、显示在线列表、显示历史记录、发送消息、出错。同时通过统一的外部接口导出:exports.EVENT_TYPE={'LOGIN':'LOGIN','LOGOUT':'LOGOUT','SPEAK':'SPEAK','LIST_USER':'LIST_USER','ERROR':'ERROR','LIST_HISTORY':'LIST_HISTORY'};在zTool.js中定义了2个工具类,simpleMap和circleList,ChatLab中统一管理对外的Host地址和端口号,并提供几个工具方法来解析JSON字符串://服务端口exports.PORT=8000;//服务端口//needtoaltertoyouripadressexports.HOST="localhost";varanalyzeMessageData=exports.analyzeMessageData=function(message){try{returnJSON.parse(message);}catch(error){//收到了非正常格式的数据console.log('method:analyzeMsgData,error:'+error);}returnnull;}vargetMsgFirstDataValue=exports.getMsgFirstDataValue=function(mData){if(mData&&mData.values&&mData.values[0]){returnmData.values[0];}return'';}vargetMsgFirstDataValue=exports.getMsgSecondDataValue=function(mData){if(mData&&mData.values&&mData.values[1]){returnmData.values[1];}return'';}Chat.js主要负责客户端的大众聊天室与服务端的通信功能其中将页面分为2个大的div,只有在输入用户昵称之后聊天室主界面的div才会显示出来:$("#open").click(function(event){currentUserNick=$.trim($("#nickInput").val());if(''==currentUserNick){alert('请先输入昵称');return;}$("#prePage").hide();$("#mainPage").show();reset();然后连接服务器,基于socket的事件做一些相对应的处理:socket=newWebSocket("ws://"+HOST+":"+PORT);onlineUserMap=newzTool.SimpleMap();socket.onmessage=function(event){varmData=chatLib.analyzeMessageData(event.data);if(mData&&mData.event){switch(mData.event){caseEVENT_TYPE.LOGIN://新用户连接varnewUser=mData.values[0];if(flag==0){currentUser=newUser;flag=1;}connCounter=mData.counter;onlineUserMap.clone(mData.values[1]);updateOnlineUser();appendMessage(formatUserTalkString(newUser)+"[进入房间]");break;caseEVENT_TYPE.LOGOUT://用户退出varuser=mData.values[0];onlineUserMap.remove(user.uid);updateOnlineUser();appendMessage(formatUserTalkString(user)+"[离开房间]");break;caseEVENT_TYPE.SPEAK://用户发言varcontent=mData.values[0];if(mData.user.uid!=currentUser.uid){appendMessage(formatUserTalkString(mData.user));appendMessage("<span>&nbsp;&nbsp;</span>"+content);}break;caseEVENT_TYPE.LIST_USER://获取当前在线用户varusers=mData.values;if(users&&users.length){for(variinusers){//alert(i+'user:'+users[i].uid);//alert('uid:'+currentUser.uid);if(users[i].uid!=currentUser.uid)onlineUserMap.put(users[i].uid,users[i]);}}//alert('currentUser:'+currentUser);updateOnlineUser();break;caseEVENT_TYPE.LIST_HISTORY://获取历史消息//{'user':data.user,'content':content,'time':newDate().getTime()}vardata=mData.values;if(data&&data.length){for(variindata){appendMessage(formatUserTalkHisString(data[i].user,data[i].time));appendMessage("<span>&nbsp;&nbsp;</span>"+data[i].content);}appendMessage("<spanclass='gray'>==================以上为最近的历史消息==================</span>");}break;caseEVENT_TYPE.ERROR://出错了appendMessage("[系统繁忙...]");break;default:break;}}};socket.onerror=function(event){appendMessage("[网络出错啦,请稍后重试...]");};socket.onclose=function(event){appendMessage("[网络连接已被关闭...]");close();};socket.onopen=function(event){socket.send(JSON.stringify({'EVENT':EVENT_TYPE.LOGIN,'values':[currentUserNick]}));socket.send(JSON.stringify({'EVENT':EVENT_TYPE.LIST_USER,'values':[currentUserNick]}));socket.send(JSON.stringify({'EVENT':EVENT_TYPE.LIST_HISTORY,'values':[currentUserNick]}));};});通过点击加入大众聊天室按钮进入大众聊天室模块,大众聊天室的主要功能在客户端完成,服务器端口做转发之后形成P2P的客户端连接方式:varvideos=[];varrooms=[1,2,3,4,5];varPeerConnection=window.PeerConnection||window.webkitPeerConnection00||window.webkitRTCPeerConnection;//setvideo'slayoutinpage,automaticlyadapttofitthebestlayoutfunctiongetNumPerRow(){varlen=videos.length;varbiggest;//Ensurelengthisevenforbetterdivision.if(len%2===1){len++;}biggest=Math.ceil(Math.sqrt(len));while(len%biggest!==0){biggest++;}returnbiggest;}functionsubdivideVideos(){varperRow=getNumPerRow();varnumInRow=0;for(vari=0,len=videos.length;i<len;i++){varvideo=videos[i];setWH(video,i);numInRow=(numInRow+1)%perRow;}}functionsetWH(video,i){varperRow=getNumPerRow();varperColumn=Math.ceil(videos.length/perRow);varwidth=Math.floor((window.innerWidth)/perRow);varheight=Math.floor((window.innerHeight-190)/perColumn);video.width=width;video.height=height;video.style.position="absolute";video.style.left=(i%perRow)*width+"px";video.style.top=Math.floor(i/perRow)*height+"px";}functioncloneVideo(domId,socketId){varvideo=document.getElementById(domId);varclone=video.cloneNode(false);clone.id="remote"+socketId;document.getElementById('videos').appendChild(clone);videos.push(clone);returnclone;}functionremoveVideo(socketId){varvideo=document.getElementById('remote'+socketId);if(video){videos.splice(videos.indexOf(video),1);video.parentNode.removeChild(video);}}functionaddToChat(msg,color){varmessages=document.getElementById('messages');msg=sanitize(msg);if(color){msg='<spanstyle="color:'+color+';padding-left:15px">'+msg+'</span>';}else{msg='<strongstyle="padding-left:15px">'+msg+'</strong>';}messages.innerHTML=messages.innerHTML+msg+'<br>';messages.scrollTop=10000;}functionsanitize(msg){returnmsg.replace(/</g,'&lt;');}functioninitFullScreen(){varbutton=document.getElementById("fullscreen");button.addEventListener('click',function(event){varelem=document.getElementById("videos");//showfullscreenelem.webkitRequestFullScreen();});}functioninitNewRoom(){varbutton=document.getElementById("newRoom");button.addEventListener('click',function(event){varchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";varstring_length=8;varrandomstring='';for(vari=0;i<string_length;i++){varrnum=Math.floor(Math.random()*chars.length);randomstring+=chars.substring(rnum,rnum+1);}window.location.hash=randomstring;location.reload();})}functioninitChat(){varinput=document.getElementById("chatinput");varroom=window.location.hash.slice(1);varcolor="#"+((1<<24)*Math.random()|0).toString(16);input.addEventListener('keydown',function(event){varkey=event.which||event.keyCode;if(key===13){rtc._socket.send(JSON.stringify({"eventName":"chat_msg","data":{"messages":input.value,"room":room,"color":color}}),function(error){if(error){console.log(error);}});addToChat(input.value);input.value="";}},false);rtc.on('receive_chat_msg',function(data){console.log(data.color);addToChat(data.messages,data.color.toString(16));});}functioninit(){if(PeerConnection){rtc.createStream({"video":true,"audio":true},function(stream){document.getElementById('you').src=URL.createObjectURL(stream);videos.push(document.getElementById('you'));rtc.attachStream(stream,'you');subdivideVideos();});}else{alert('Yourbrowserisnotsupportedoryouhavetoturnonflags.Inchromeyougotochrome://flagsandturnonEnablePeerConnectionremembertorestartchrome');}if(typeofWebSocket==='undefined'){console.log(WebSocket);}varroom=window.location.hash.slice(1);//needtoaltertoyouripaddress//Whenusinglocalhostrtc.connect("ws://localhost:8001",room);rtc.on('addremotestream',function(stream,socketId){console.log("ADDINGREMOTESTREAM...");varclone=cloneVideo('you',socketId);document.getElementById(clone.id).setAttribute("class","");rtc.attachStream(stream,clone.id);subdivideVideos();});rtc.on('disconnectstream',function(data){console.log('remove'+data);removeVideo(data);});initFullScreen();initNewRoom();initChat();}window.onresize=function(event){subdivideVideos();};通过HTML5中的video标签将视频流输出到页面上,前端页面是用jade 模板 个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载 引擎解析的:htmlheadtitleExamplewebrtc.iolink(type='text/css',href='stylesheets/rtcstyle.css',rel='stylesheet')script(src='/javascripts/webrtc-client.js')script(src='/javascripts/client.js')body(onload='init()')#videosvideo#you.flip(autoplay='autoplay')#chatboxbutton#fullscreenEnterFullScreenbutton#newRoomCreateANewRoom#messagesbrinput#chatinput(type='text')注意要把video标签的autoplay属性设置好,那么在加入新的连接的时候会将新的视频流更新在页面上。四、下一步改进1.整体界面美化2.更详细的撰写技术文档3.完善项目的错误提醒 机制 综治信访维稳工作机制反恐怖工作机制企业员工晋升机制公司员工晋升机制员工晋升机制图 webtrc大众聊天室大众视频聊天室私人视频聊天室webrtc.chatdemo/.gitignorenode_modulesnpm-debug.logcomponentschatdemo中期报告.docwebrtc.chatdemo/zTool.js/***主要实现SImpleMap和CircleList两个工具类*/(function(exports){ varSimpleMap=exports.SimpleMap=function(){ this.map={}; this.mapSize=0; }; SimpleMap.prototype.put=function(key,value){ varoldValue=this.map[key]; this.map[key]=value; if(!oldValue){ this.mapSize++; } return(oldValue||value); }; SimpleMap.prototype.get=function(key){ returnthis.map[key]; }; SimpleMap.prototype.remove=function(key){ varv=this.map[key]; if(v){ deletethis.map[key]; this.mapSize--; }; returnv; }; SimpleMap.prototype.size=function(){ returnthis.mapSize; }; SimpleMap.prototype.clear=function(){ this.map={}; this.mapSize=0; }; SimpleMap.prototype.keySet=function(){ vartheKeySet=[]; for(variinthis.map){ theKeySet.push(i); } returntheKeySet; }; SimpleMap.prototype.values=function(){ vartheValue=[]; for(variinthis.map){ theValue.push(this.map[i]); } returntheValue; }; SimpleMap.prototype.clone=function(clonemap){ this.map=clonemap.map; this.mapSize=clonemap.mapSize; } varCircleList=exports.CircleList=function(maxSize){ this.maxSize=(maxSize||10); this.list=[]; this.index=null; }; CircleList.prototype.clear=function(){ this.list=[]; this.index=null; }; CircleList.prototype.add=function(value){ if(null==this.index){ this.index=0; } this.list[this.index++]=value; if(this.index==this.maxSize){ this.index=0; } }; CircleList.prototype.values=function(){ vartheValue=[]; if(null!=this.index){ if(this.list.length==this.maxSize){ for(vari=this.index;i<this.maxSize;i++){ theValue.push(this.list[i]); } } for(vari=0;i<this.index;i++){ theValue.push(this.list[i]); } } returntheValue; };})((function(){ if(typeofexports==='undefined'){ window.zTool={}; returnwindow.zTool; }else{ returnexports; }})());webrtc.chatdemo/chatLib.js(function(exports){ //事件类型 exports.EVENT_TYPE={ 'LOGIN':'LOGIN', 'LOGOUT':'LOGOUT', 'SPEAK':'SPEAK', 'LIST_USER':'LIST_USER', 'ERROR':'ERROR', 'LIST_HISTORY':'LIST_HISTORY' }; //服务端口 exports.PORT=8000; //服务端口 exports.HOST="192.168.175.103"; varanalyzeMessageData=exports.analyzeMessageData=function(message){ try{ returnJSON.parse(message); }catch(error){ //收到了非正常格式的数据 console.log('method:analyzeMsgData,error:'+error); } returnnull; } vargetMsgFirstDataValue=exports.getMsgFirstDataValue=function(mData){ if(mData&&mData.values&&mData.values[0]){ returnmData.values[0]; } return''; } vargetMsgFirstDataValue=exports.getMsgSecondDataValue=function(mData){ if(mData&&mData.values&&mData.values[1]){ returnmData.values[1]; } return''; }})((function(){ if(typeofexports==='undefined'){ window.chatLib={}; returnwindow.chatLib; }else{ returnexports; }})());webrtc.chatdemo/README.md#webrtc.chatdemo###Introduce本程序是基于websocket和webrtc做的一个在线实时视频流聊天室,制作起因是由于计算机网络课程的一个课程加分Project,顺带可以用来参加一个比赛,然后基于github上的一些开源项目做出了自己的一些修改和整合,现在依然还在不断改进之中。###LicenseCopyright(C)2012[SergioZhao](https://github.com/zsj2145676)Permissionisherebygranted,freeofcharge,toanypersonobtainingacopyofthissoftwareandassociateddocumentationfiles(the"Software"),todealintheSoftwarewithoutrestriction,includingwithoutlimitationtherightstouse,copy,modify,merge,publish,distribute,sublicense,and/orsellcopiesoftheSoftware,andtopermitpersonstowhomtheSoftwareisfurnishedtodoso,subjecttothefollowingconditions:TheabovecopyrightnoticeandthispermissionnoticeshallbeincludedinallcopiesorsubstantialportionsoftheSoftware.THESOFTWAREISPROVIDED"ASIS",WITHOUTWARRANTYOFANYKIND,EXPRESSORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIESOFMERCHANTABILITY,FITNESSFORAPARTICULARPURPOSEANDNONINFRINGEMENT.INNOEVENTSHALLTHEAUTHORSORCOPYRIGHTHOLDERSBELIABLEFORANYCLAIM,DAMAGESOROTHERLIABILITY,WHETHERINANACTIONOFCONTRACT,TORTOROTHERWISE,ARISINGFROM,OUTOFORINCONNECTIONWITHTHESOFTWAREORTHEUSEOROTHERDEALINGSINTHESOFTWARE.webrtc.chatdemo/package.json{"name":"webrtc.chatdemo","version":"0.0.1","private":true,"scripts":{"start":"nodeapp.js"},"dependencies":{"express":"latest","jade":"latest","webrtc.io":"latest","ws":"latest"},"author":"SergioZhao"}webrtc.chatdemo/component.json{"name":"webrtc.chatdemo","version":"0.0.1","scripts":{ "start":"nodeapp.js"},"dependencies":{"bootstrap":"latest","jquery":"latest"}}webrtc.chatdemo/app.js/***Moduledependencies.*/varexpress=require('express'),routes=require('./routes'),user=require('./routes/user'),rtc=require('./routes/rtc'),http=require('http'),path=require('path'),WebSocketServer=require('ws').Server,chatLib=require("./chatLib"),zTool=require("./zTool.js"),EVENT_TYPE=chatLib.EVENT_TYPE,PORT=chatLib.PORT,onlineUserMap=newzTool.SimpleMap(),historyContent=newzTool.CircleList(100),connCounter=1,uid=null;varapp=express();app.configure(function(){app.set('port',process.env.PORT||8000);app.set('views',__dirname+'/views');app.set('viewengine','jade');app.use(express.favicon());app.use(express.logger('dev'));app.use(express.bodyParser());app.use(express.methodOverride());app.use(app.router);app.use(express.static(path.join(__dirname,'public')));app.use(express.static(path.join(__dirname,'components')));});app.configure('development',function(){app.use(express.errorHandler());});app.get('/',routes.index);app.get('/users',user.list);app.get('/rtc',rtc.open);varserver=http.createServer(app).listen(app.get('port'),function(){console.log("Expressserverlisteningonport"+app.get('port'));});wss=newWebSocketServer({server:server});wss.on('connection',function(conn){//conn.on('open',function(){//conn.send(JSON.stringify({'uid':connCounter}));//});conn.on('message',function(message){varmData=chatLib.analyzeMessageData(message);if(mData&&mData.EVENT){switch(mData.EVENT){caseEVENT_TYPE.LOGIN://新用户连接uid=connCounter;conn.socketid=uid;varnewUser={'uid':uid,'nick':chatLib.getMsgFirstDataValue(mData)};console.log('User:{\'uid\':'+newUser.uid+',\'nickname\':'+newUser.nick+'}comingonprotocolwebsocketdraft'+conn.protocolVersion);console.log('currentconnectingcounter:'+wss.clients.length);//把新连接的用户增加到在线用户列表onlineUserMap.put(uid,newUser);console.log(onlineUserMap);connCounter++;//把新用户的信息广播给在线用户for(vari=0;i<wss.clients.length;i++){wss.clients[i].send(JSON.stringify({'user':onlineUserMap.get(uid),'event':EVENT_TYPE.LOGIN,'values':[newUser,onlineUserMap],'counter':connCounter}));}break;caseEVENT_TYPE.SPEAK://用户发言varcontent=chatLib.getMsgSecondDataValue(mData);//同步用户发言for(vari=0;i<wss.clients.length;i++){wss.clients[i].send(JSON.stringify({'user':onlineUserMap.get(chatLib.getMsgFirstDataValue(mData)),'event':EVENT_TYPE.SPEAK,'values':[content]}));}historyContent.add({'user':onlineUserMap.get(uid),'content':content,'time':newDate().getTime()});break;caseEVENT_TYPE.LIST_USER://获取当前在线用户conn.send(JSON.stringify({'event':EVENT_TYPE.LIST_USER,'values':onlineUserMap.values()}));break;caseEVENT_TYPE.LIST_HISTORY://获取最近的聊天记录conn.send(JSON.stringify({'user':onlineUserMap.get(uid),'event':EVENT_TYPE.LIST_HISTORY,'values':historyContent.values()}));break;default:break;}}else{//事件类型出错,记录日志,向当前用户发送错误信息console.log('desc:message,userId:'+chatLib.getMsgFirstDataValue(mData)+',message:'+message);conn.send(JSON.stringify({'uid':chatLib.getMsgFirstDataValue(mData),'event':EVENT_TYPE.ERROR}));}});conn.on('error',function(){console.log(Array.prototype.join.call(arguments,","));});conn.on('close',function(){console.log('User:{\'uid\':'+conn.socketid+',\'nickname\':'+onlineUserMap.get(conn.socketid).nick+'}logout');varlogoutUser=onlineUserMap.remove(conn.socketid);if(logoutUser){//把已退出用户的信息广播给在线用户for(vari=0;i<wss.clients.length;i++){wss.clients[i].send(JSON.stringify({'uid':conn.socketid,'event':EVENT_TYPE.LOGOUT,'values':[logoutUser]}));}}});});console.log('Startlisteningonport'+PORT);/***RTCcode*/varwebRTC=require('webrtc.io').listen(8001);webRTC.rtc.on('connect',function(rtc){//Clientconnected});webRTC.rtc.on('sendanswer',function(rtc){//answersent});webRTC.rtc.on('disconnect',function(rtc){//Clientdisconnect});//大众聊天室聊天功能webRTC.rtc.on('chat_msg',function(data,socket){varroomList=webRTC.rtc.rooms[data.room]||[];for(vari=0;i<roomList.length;i++){varsocketId=roomList[i];if(socketId!==socket.id){varsoc=webRTC.rtc.getSocket(socketId);if(soc){soc.send(JSON.stringify({"eventName":"receive_chat_msg","data":{"messages":data.messages,"color":data.color}}),function(error){if(error){console.log(error);}});}}}});webrtc.chatdemo/views/rtc.jadehtmlheadtitleExamplewebrtc.iolink(type='text/css',href='stylesheets/rtcstyle.css',rel='stylesheet')script(src='/javascripts/webrtc-client.js')script(src='/javascripts/client.js')body(onload='init()')#videosvideo#you.flip(autoplay='autoplay')#chatboxbutton#fullscreenEnterFullScreenbutton#newRoomCreateANewRoom#messagesbrinput#chatinput(type='text')webrtc.chatdemo/views/demo.jadehtmlbody#errorPage.page(style='display:none;')h1|当前浏览器不支持WebSocket,请使用chromeoroperaorfirefox18#prePage.page(style='width:690px;text-align:center;')input#nickInput(type='text',placeholder='请输入您的昵称')input#open(type='button',value='进入聊天室')#mainPage.page(style='display:none;')div(style='overflow:hidden;').talkLeft#talkFrame#inputDivtextarea#message(placeholder='嗨,随便说点啥呗')div(style='overflow:hidden;')input#createroom.f-left(type='button',value='创建聊天室')input#send.f-right(type='button',value='发送').talkRight#onlineUsersbrdiv(style='text-align:center;')a(style='color:blue;',target='_blank',href='http
本文档为【WebRtc-Freeswitch搭建视频通话】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_841159
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2017-06-06
浏览量:2880