共计 2223 个字符,预计需要花费 6 分钟才能阅读完成。
为什么做这个?
今年初接到一个项目任务,客户要求在自己的音视频平台系统中集成 webrtc 功能(原系统是基于 SIP 协议开发的,已经稳定运行多年,有很多客户)。在比对了多家 RTC 产品的效果后,他们对声网音视频 DEMO 效果后非常满意,指定要求用声网的 SD-RTN 传输网络,全面改造客户端软件。据客户实测,在某些国家和地区,同样网络环境下比微信要好很多,比如在东非和中国之间语音通话,延迟很小、声音也更清晰。
话不多说,先列下客户要求和当前产品的问题:
1. 要求全面改造 Android、IOS、Windows、MacOS、Web 版 5 个平台的客户端软件,原来的客户端分别是基于 Pjsip、Linphone、Sipjs 开发的;
2. 要求在网络环境差的地方,也能满足清晰语音通话的要求(声网专为此而生);
3. 最小侵入性,尽量不改变服务器端的系统功能,实现客户无感升级;
4. 解决 SIP 协议经常碰到丢包、被过滤 UDP 等无法呼叫,或者呼叫听不清的问题;
5. 解决 SIP 服务器经常被尝试攻击呼叫、恶意扫描注册攻击等行为,提高系统稳定性;
6. 实现 WebRTC 协议和 SIP 协议的双向互通,既要兼容 SIP 呼叫,支持 RTC 客户端送呼叫到 SIP Server,也要支持 SIP Server 呼入到客户端软件(在声网的音视频实时传输网传输)。
其实刚接到需求的时候,大家一起讨论分析过,觉得这种项目看着有不少预算,但是要做的是全平台的客户端,开发任务繁重,要考虑的细节也比较多,没准是个坑,能不能达到客户期望难说,多数同事不建议做。然后在领导和客户一起去 happy 一晚后,这活儿不知道怎么就接了下来(⊙ˍ⊙)
老板理由很简单,这也不做那也不做,那我们可以做什么?如果谁都能做,客户还会找我们吗? 那就干吧,马上行动,各种查资料,翻阅声网的技术开发文档,并咨询声网的技术同学。2 天后拿出了初步方案。
解决思路:
1、自己写信令模块,保持灵活性,简单实现:开发 TCP Server 承担信令服务器;
2、核心是开发一个 SIP2WebRTC/WebRTC2SIP 协议转换网关,维护一个状态机;
3、开发音视频编解码处理器,解决声网语音和 SIP 语音编码互通;
4、开发一个状态管理模块,SessionManger,以维护客户端的状态 IP+ 端口;
5、结合声网的音视频 SDK,集成自己的信令模块,实现和 WebRTC2SIP 模块通讯;
6、自定义常见的 SIP 呼叫信令,供各平台客户端保持一致。
常用的 SIP 信令有:1 注册、2 呼叫、3 接听、4 挂断、5 拒接、6 取消、7Hold、8DTMF、9 用户未反映、10 用户离线、11Transfer、12 会议(我简单介绍前面的 6 个)
我们暂且把这个系统命名为 WebRTC2SIP Connector 或者 SIP2WebRTC Connector 吧。至于为什么这么叫,我也不知道,可能叫 XX Gateway 的太多了,不这么叫显不出声网的 SD-RTN 有多牛 X,我是他爹,想叫什么都可以(~▽~)*
理清思路后,我们需要确认几个核心问题:
1、以哪个平台的 SDK 为基础开发这个 WebRTC2SIP Connector 核心模块?
2、Agora SDK 是否支持多并发呼叫?
3、声网的语音编码格式和视频编码格式是什么?采样率多少?
4、SIP 客户测有没有什么具体的编码要求?客户可接受固定一个语音编码,我选择 PCMA
这里特别 感谢 一下 声网,对我们这种小众需求做出了快速响应,也感谢声网技术支持同学Nemo,专门来到公司交流了几个小时,并分享了一些技术信息。
他建议我们:
1、用 Agora Windows SDK 或者 Linux SDK 开发协议转换模块;
2、2 个 SDK 都支持多并发呼叫;
3、语音是 pcm 格式,视频是 yuv 格式;采样率是 48khz
到这里心里有数了,简要文字描述下大概流程就是:
1、各客户端 SDK 启动的时候,发起 TCP 连接,登录 TCP Server 信令服务器, WebRTC2SIP 转接模块初始化也发起 TCP 连接登录 TCP Server,由 TCP Server 记录大家的 UID,IP 和端口等信息。
2、呼叫的时候,申请一个房间号,并根据自定义信令格式发起 calling 报文,TCP Server 收到后,转发给转接模块 WebRTC2SIP,WebRTC2SIP 收到后创建 1 个线程,解析报文,并启动声网的 SDK,加入指定房间号,开始读取音频流程,同时启动线程,封装 SIP 标准报文,发起 sip invite 请求给电话服务器 SIP Server; SIP Server 收到呼叫请求就去呼叫被叫电话号码,并返回 ring 振铃信号;WebRTC2SIP 收到振铃信号,封装自定义的振铃信息给客户端 SDK,被叫接听后,WebRTC2SIP,启动 Media Coder 开始解析媒体流,并 resample 后,写入到声网的房间里面。实现语音通话。描述个大概,相信能看明白。
3、从 SIP 呼入到声网的 SDK,大同小异,反过来。
这里要注意:
1、每个终端都要自定义编号;
2、每个呼叫都要加入声网的房间 channel 实现音视频互通;
3、因为编码不一样,所以需要 resample 这个很重要,不要接通了没有声音,双方不匹配。
4、WebRTC2SIP 模块要多线程方式处理,以实现并发呼叫;
5、WebRTC2SIP 模块要维护一个完整的状态机,给每个通话加唯一编号,不至于出错。
到现在我们讲清楚了大概的解决方案和技术思路,看到这里,各位客官应该明白了,其实这个做起来没啥难度,至少现在看来是这样的。