基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 方案和思路(一)

为什么做这个?

今年初接到一个项目任务,客户要求在自己的音视频平台系统中集成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天后拿出了初步方案。

基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 方案和思路(一)

解决思路:
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 模块要维护一个完整的状态机,给每个通话加唯一编号,不至于出错。

到现在我们讲清楚了大概的解决方案和技术思路,看到这里,各位客官应该明白了,其实这个做起来没啥难度,至少现在看来是这样的。

上一篇:面试无人问津到手握蚂蚁金服、快手等offer,我是如何准备大厂Android面试的?


下一篇:【短视频SDK - 参数解析】对焦模式、裁剪模式、视频质量、分辨率、视频比例、帧率、关键帧间隔等参数解析