音视频
Webrtc是目前主流的音视频解决方案,它提供了媒体能力,信令需要另外来扩展。webrtc官方提供的demo使用起来非常麻烦,我们基于野火IM的通信能力,构建了一套信令系统,非常方便的使用。我们提供的的音视频有两种模式,免费版使用P2P模式,可以支持4路视频通话,客户可以免费使用,但不提供源码;音视频高级版支持能多路表现更稳定。
0.0.1. 野火音视频的组成部分
野火音视频系统有如下几部分组成。
- 野火IM,作为信令传输通道,负责把信令在通话两端传递。与谷歌方案中的
Signailing Server
作用稍有不同,野火IM服务只作为透传信令到客户端,客户端SDK实现所有逻辑。 - EngineKit,封装了WebRTC信令,做成了一个简单易用的音视频库,用户只需要startCall,endCall来使用。免费版已经集成到Android/iOS Demo应用中了,高级版需要替换这个SDK。UI部分是开源的同时兼容这两个SDK。
- WebRTC库,直接使用谷歌提供编译好的软件包,android的版本是1.0.30039,iOS的版本是1.0.26195,PC使用的是Chromium v69.0.3497.128。
- Turn服务,需要部署开源turn服务器,不需要另外部署服务器。不需要另外搭建STUN服务,因为Turn服务自带STUN服务的功能。服务与其它任何服务都没有依赖,可以单独部署,需开放3478端口(TCP和UDP都需要开放)和所需要的UDP端口(默认需要开放所有UDP端口,也可以配置turn服务设定UDP端口范围)。音视频高级版不需要Turn服务。
- 媒体服务,仅音视频高级版需要。免费版不需要。
0.0.2. 使用方法
确保野火IM功能正常,确保通话双方能够收发消息
部署Turn服务器(音视频高级版不需要Turn服务,可以直接跳到第三步),建议部署coTurn,部署方法请使用百度查询。部署完毕后,使用这个链接检查turn服务是否部署成功。注意一定要是turn服务,不能是stun服务,一定要出现下图中红线标注的type。
当Type为"relay"且后面的地址为您的公网IP时,表明turn服务部署成功,否则为失败。
修改客户端配置 在客户端的config文件中,修改地址为您部署的turn服务器地址。如果是音视频高级版,可以删除掉对应内容。
NSString *ICE_ADDRESS = @"turn:turn.liyufan.win:3478"; NSString *ICE_USERNAME = @"wfchat"; NSString *ICE_PASSWORD = @"wfchat";
注意如果客户分属多区域,可以部署多个turn服务器来提高用户体验。音视频添加turn服务信息的接口可以调用多次,每次增加一个turn服务器。
替换音视频库 如果是高级版音视频,需要替换EngineKit库,替换方法在随SDK发布的说明上,免费版请忽略。
启动媒体服务。 如果是高级版音视频,需要启动媒体服务,启动方法在媒体服务发布的说明上,免费版不需要此服务。
0.0.3. 各个版本的对比
功能 | 免费版 | 高级版 |
---|---|---|
实现方式 | Mesh | SFU |
媒体服务 | 不需要 | 需要 |
媒体流是否经过服务器 | 部分 | 全部 |
流量带宽要求 | 低 | 高 |
同时支持视频路数 | 4 | 9 |
同时支持音频路数 | 9 | 20 |
录制 | 不支持 | 支持 |
价格 | 便宜 | 稍贵 |
是否依赖Turn服务 | 是 | 否 |
是否部署媒体服务 | 否 | 是 |
对IM服务依赖 | 社区版或专业版 | 专业版 |
是否支持会议 | 否 | 是 |
更多详细内容,请参考野火音视频简介。
0.0.4. 各个版本见的互通性说明
- 野火IM官方发布的可执行文件,包含Android、iOS、PC和线上的web端,所使用的都是高级版音视频。
- Android、iOS端源码里面包含的是免费版音视频库。如果购买高级版需要野火发布高级版的库替换打包。
- PC、Web端项目中同时包含免费版和高级版音视频库,默认使用的是免费版。如果购买高级版需要自主替换。
- 高级版和免费版之间不互通。
0.0.5. 上线一定要自己部署Turn服务
野火IM提供了体验用的环境,环境配置为1C1G5M,仅能够供应体验使用,我们会不定期的更新密码,免费版上线商用时一定要切换到自己的Turn服务器。
0.0.6. 其它
- turn服务可以部署多个,在客户端多次调用addIceServer即可。当用户在全球多个区域分布式,可以在不同区域部署多个turn服务,提高体验。
- turn服务和媒体服务可以购买流量计费云服务器,流量计费的带宽足够大,而且按量计费价格也会很便宜。
0.0.7. 如何安装Turn服务
Turn服务不是野火IM的内容,就像mysql,redis之类的基础组件,需要客户自行安装的,这里也提供一个安装说明,仅供大家参考。点如何安装Turn服务了解详情。
0.0.8. 问题排查
- 部署TURN服务一定要用上文中的链接检查,得到的结果一定要有
relay
类型的候选,且地址为您的公网地址。另外不能有报错信息。 - 开通TURN服务的TCP3478端口,可以在浏览器中输入
http://turn服务器地址:3478
,正确情况下应该返回部分信息。 - 开通TURN使用的UDP端口,默认是所有UDP端口,也可以在turn服务配置中限定端口范围和3478端口(除了配置文件内指定的端口范围外,还需要开通3478的UDP端口),每一路视频通话至少需要4个端口,可以配置您期望的最高通话路数*4个端口。点这里检查UDP端口连通性
- 修改客户端的配置,注意格式,
turn:域名或ip:3478
,不要忘记头部的turn
字段。 - 如果客户在内网,一定要确认内网防火墙是否开通了对turn服务的3478TCP端口及UDP端口的访问权限。
- 如果是高级版,注意IM是否使用的是绑定的域名。
- 如果是高级版,注意SDK是否替换正确。
- 如果是高级版,检查媒体服务是否运行中。
- 如果是高级版,请按照音视频高级版服务项目上的说明排查音视频服务是否正确。
- 如果wifi下能够通话,4G/5G下不行,那肯定就是turn服务的问题。
- 检查服务器带宽是否足够,要用
iftop
命令查询实时带宽状态,不用用云服务商提供的监控(那个是几分钟聚合的,不能反映瞬时的状态)。建议使用按流量计费的服务。如果是高级版,请忽略掉turn的检查。
0.0.9. 针对浏览器问题排查
- 完成上一步的前置问题排查
- 测试浏览器是否支持webrtc,测试地址)
- 默认只有通过localhost或https访问网页时,才可以使用webrtc功能。如果需要在http访问网页时,测试webrtc功能,请参考这儿
0.0.10. 带宽计算
多人音视频SDK是试用p2p模式的,会先尝试打洞直连,如果打洞失败则会通过turn服务中转。一般情况下有一方是流量时肯定无法打洞成功;双方都是wifi的情况下也有可能打洞失败(跟网络有关)。我们的经验是大概有50%是无法打洞直连的。通话的流量跟路数成正比,1对1通话就是2路,N人通话就是N*(N+1)路通话,每一路视频通话的流量上下行各100KB/s。语音通话每一路的流量在3KB/s左右,所以相比视频可以忽略不计。
所以,如果是100个1对1通话,那么有50个1对1通话是走turn服务,50个1对1通话是100路,流量为100*100KB/s = 10MB/s = 80mbps。turn服务可以部署多台,客户端配置多个turn服务地址即可。这个是估计的情况,上线后还要根据实际情况来调整。
以上是多人音视频的带宽估计,高级版全部走服务器中转,通话质量更高,但1对1通话没有直连,流量消耗更高,但在多人视频通话中有大小流,消耗带宽则相比Mesh架构显著降低,具体信息在高级版服务上有说明。