前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 方案和思路(一)

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

原创
作者头像
qzlink.com
修改2020-07-01 18:03:40
2.9K0
修改2020-07-01 18:03:40
举报
文章被收录于专栏:Freeswitch/SIP/WebRTC通讯

为什么做这个?

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

系统架构图.png
系统架构图.png

解决思路:

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档