您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > WebRtc-Freeswitch搭建视频通话
简介WebRTC网页实时通信(WebReal-TimeCommunication),由google发布的一版开源项目,目的主要是让Web开发者能够基于浏览器(Chrome\FireFox\...)轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任何插件。使用支持webrtc的浏览器提供的接口,可以实现对视频的采集、编码、显示、传输。目前WebRTC支持HTML5和JavaScriptWebRTC架构图Web开发者只关注”Theweb”层,即调用浏览器提供的javascript接口;从图中可以看出WebRTC传输使用SRTP协议,NAT穿越使用的是ICE+STUN+TURN[参考1]JsSIP提供了一个兼容WebRTC的JSSIP库;本文中使用的是JsSIP的一个Demo作为视频通话的客户端。FreeswitchFreeswitch是一个C\C++实现的开源的电话软交换平台,作为服务端在VOIP中应用比较广泛。Freeswitch从版本1.4.4完全支持Webrtc。本文中使用Freeswitch(版本1.4.18)作为视频通话的服务端,包含了SIP服务器、STUN服务器、视频转发服务器等。本文实现场景使用Freeswitch提供的默认账号,两个用户在不同的计算机上登录;通过拨号的方式双发可以进行视频通话。安装JsSIPJsSip实现是嵌入在Html页面中,搭建一个页面服务器,然后把相关的文件拷贝到根目录下;使用浏览器访问即可。本文中使用IIS作为网页服务器,Firefox浏览器测试从截图中可以看出,需要一个用户名和密码;Sip的URL和WS(WebSocket)URLFreeswitch本文搭建的环境是在虚拟机上实现安装linux,版本是centos6;安装过程保证能够连接外网,需要下载安装包获取Freeswitch源码gitclone转到Freeswitch目录下./bootstrap.sh–j./configure–C–prefix=/usr/local/freeswitchmakemakeinstall安装声音插件makesounds-installmakemoh-install注:1.过程中需要的一些库,系统没有提供,导致编译失败;使用yuminstall的方法安装2.可已通过modules.conf配置那些模块一起编译;opus没有编译过,在此文件注释掉了3.如果Freeswitch中的某个模块出现连接错误,可以clean后重新make试一下修改配置(1)修改vars.xml文件变量(黑色部分为添加的项)X-PRE-PROCESScmd=setdata=global_codec_prefs=PCMU,PCMA,GSM,H264,H263/X-PRE-PROCESScmd=setdata=outbound_codec_prefs=PCMU,PCMA,GSM,H264,H263/(2)修改配置文件conf/sip_profiles/interanl.xml,打开中去掉ws-binding5066的注释(3)关闭linux的防火墙(如不关闭客户端可能会有访问拒绝错误)serviceiptablesstop呼叫Freeswitc默认设置了20个用户(用户名1000-1019)密码:1234;使用默认用户测试环境:ClientA:PC端使用虚拟摄像头播放一段视频,用户名1012ClientB:笔记本,使用摄像头采集实时视频用户名1011Freeswitch–SipIP:192.168.12.244:5060Freeswitch–WSURL192.168.12.244:5066ClientA和ClientB可以通过音视频通信,同时可以发送文字chat流程分析WebRTC在WebRTC的实现过程中对于音视频数据的传输有两种方式,一、网页点对点,只有信令通过服务器,而音视频数据通过P2P的方式直接传输;二、音视频数据也通过服务器中转转。网页点对点WebRTC实现了网页点对点交流。但,WebRTC仍然需要服务器,作用:1.交换客户端元数据协调通讯,即信令(Signaling)。2.应对NATs(NetworkAddressTranslators)和防火墙让信令服务器和媒体服务器分开,只有信令交互通过服务器,而媒体传输通过P2P的方式,这样做的优势在于降低了服务器端的流量。但这种方式主要用在一对一模式中,在一对多的情况下,还需要服务器端的媒体服务器,也是本文主要的讨论方式[参考]通过服务器中转不管是信令还是数据,BrowserA想要传递给BrowserB的数据通过Server转发给BrowserB。这种方式可以较容易的实现一对多或多对多的方式;如直播的应用。本文中的实现虽然是一对一的形式,但采用的传输的方式是此种JsSIP+FreeswitchServerBrowserABrowserB信令传输数据传输ServerBrowserABrowserB信令传输数据传输信令交互为了避免冗余,以及做到与现有技术的最大兼容,信令方法和协议都不由WebRTC标准来指定。本文实现中选用SIP信令协议和WebSocket传输协议,并采用jssip库来实现Sip的客户端。Freeswitch实现对sip的支持,在sip网络中端用UA表示,UAS代表服务端,UAC代表客户端;当bob要与alice通信时,首先bob与作为UAS的Freeswitch发起请求,然后Freeswitch作为UAC在于alice通信,之后把alice返回的信息发送给bob;从而达成交互;Freeswitch成为背靠背用户代理(B2BUA,Back-to-BackUA)SIP信令注册呼叫流程Freeswitch对于SIP的支持使用的是开源的Sofia协议栈[参考]传输协议:用于信令传输协议可以是TCP、UDP或其他;在WebRTC中使用的是WebSocket协议,其优点是:通信是全双工的客户端/服务器(消息可以同时双向传输),可以省掉多次连接和传输的数据量。当然,这也需要Freeswitch的支持,能够解析其内容数据交互通过SIP协议中INVITE用于交互音视频相关的信息;信息包含在的Request和Response中的SDP中;从中获取到音视频传输的类型和使用的ip端口本文中使用的是UDP+RTP包传递音视频数据;NAT穿越本文中的实例,无论是Client和Server都在同一个局域网内;ip不需要转换。安全相关1.在SIP协议交互中REGISTER和INVITE都需要验证请求;否则返回错误2.在UDP传输数据是使用DTLS协议保证安全协议介绍NATNAT(NetworkAddressTranslation,网络地址转换),本地地址的主机在和外界通信时,都要在NAT软件将其本地地址转换成全球IP地址,才能和因特网连接。NAT的作用1.宽带分享2.安全防护NAT的实现方式有4种,分别如下:1.FullConeNAT完全锥形NAT,所有从同一个内网IP和端口号发送过来的请求都会被映射成同一个外网IP和端口号,并且任何一个外网主机都可以通过这个映射的外网IP和端口号向这台内网主机发送包。2.RestrictedConeNAT限制锥形NAT,它也是所有从同一个内网IP和端口号发送过来的请求都会被映射成同一个外网IP和端口号。与完全锥形不同的是,外网主机只能够向先前已经向它发送过数据包的内网主机发送包。3.PortRestrictedConeNAT端口限制锥形NAT,与限制锥形NAT很相似,只不过它包括端口号。也就是说,一台IP地址X和端口P的外网主机想给内网主机发送包,必须是这台内网主机先前已经给这个IP地址X和端口P发送过数据包。4.SymmetricNAT对称NAT,所有从同一个内网IP和端口号发送到一个特定的目的IP和端口号的请求,都会被映射到同一个IP和端口号。如果同一台主机使用相同的源地址和端口号发送包,但是发往不同的目的地,NAT将会使用不同的映射。此外,只有收到数据的外网主机才可以反过来向内网主机发送包。STUN/TURN/ICESTUN协议(转自)STUN流程,首先有client向Stun服务器发起Binding请求,STUN消息头为20字节,后面紧跟0或多个属性。STUN头部包含一STUN消息类型、magiccookie、事务ID和消息长度。STUN头之后是0或多个属性。每个属性都采用TLV编码,16位的类型、16位的长度及可变长度的值。每个STUN属性必须是4字节边界对齐。属性类型MAPPED-ADDRESS标识了客户端反向传输地址(映射后的地址),这个属性只用于服务器向后兼容RFC3489的客户端。XOR-MAPPED-ADDRESS与MAPPED-ADDRESS属性是相同的,除了这映射后的地址经过了异或处理。(注意,异或运算是其自身的逆运算,再异或一下就可以得出真实的MAPPED-ADDRESS)USERNAME用于消息完整性。它采用USERNAME和PASSWORD组合方式用于消息完整性检查。MESSAGE-INTEGRITY包含STUN消息的HMAC-SHA1。它可以出现在任何类型的STUN消息中。由于使用SHA1散列算法,HMAC将会是20字节。用作HMAC输入的文本是STUN消息,包括头部,直到且包括MESSAGE-INTEGRITY属性前面的属性。除了FINGERPRINT属性外,代理必须忽略其他出现在MESSAGE-INTEGRITY属性后的任何属性。STUN消息头中的长度字段的值必须包括直到MESSAGE-INTEGRITY属性本身,但不包括任何在它之后的属性。FINGERPRINT可以存在于所有的STUN消息中,提供辅助区分STUN数据包与其他协议数据包的功能。属性的值为采用CRC32方式计算STUN消息直到但不包括FINGERPRINT属性的的结果,并与32位的值0x5354554e异或。ERROR-CODE被用于错误响应消息中。它包含一个在300至699范围内的错误响应号。错误响应号定义如下:300:尝试代替,客户端应该使用该请求联系一个代替的服务器。这个错误响应仅在请求包括一个USERNAME属性和一个有效的MESSAGE-INTEGRITY属性时发送;否则它不会被发送,而是发送错误代码为400的错误响应;400:错误请求,请求是变形了,客户在修改先前的尝试前不应该重试该请求。401:未授权,请求未包括正确的资格来继续。客户应该采用一个合适的资格来重试该请求。420:未知属性,服务器收到一个STUN包包含一个强制理解的属性但是它不会理解。服务器必须将不认识的属性放在错误响应的UNKNOWN-ATTRIBUTE属性中。438:过期Nonce,客户使用的Nonce不再有效,客户应该使用响应中提供的Nonce来重试。500:服务器错误,服务器遇到临时错误,客户应该再次尝试。REALMREALM属性可能出现在请求和响应中。在请求中表示长期资格将在认证中使用。当在错误响应中出现表示服务器希望客户使用长期资格来进行认证。NONCENONCE属性可能出现在请求和响应消息中。UNKNOWN-ATTRIBUTESUNKNOWN-ATTRIBUTES属性只在错误代码为420的的错误响应中出现。SOFTWARESOFTWARE属性用于代理发送消息时包含版本的描述。它用于客户端和服务器。它的值包括制造商和版本号。该属性对于协议的运行没有任何影响,仅为诊断和调试目的提供服务。SOFTWARE属性是个可变长度的,采用UTF-8编码的小于128个字符的序列号。ALTERNATE-SERVERALTERNATE-SERVER属性标识一个备份的传输地址表明一个STUN客户可以尝试的不同的STUN服务器。属性格式与MAPPED-ADDRESS相同。IP地址族必须与请求的源IP地址的相同。TURN在RFC5766中定义,英文全称TraversalUsing
本文标题:WebRtc-Freeswitch搭建视频通话
链接地址:https://www.777doc.com/doc-2867054 .html