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

简介: 基于声网音视频SDK开发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天后拿出了初步方案。

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

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

相关文章
|
7月前
|
编解码 视频直播 开发工具
|
3月前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
258 6
|
4月前
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
258 1
|
4月前
|
存储 监控 开发工具
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
69 0
|
5月前
|
存储 开发工具
通用快照方案问题之快照SDK的安装如何解决
通用快照方案问题之快照SDK的安装如何解决
46 0
|
6月前
|
Linux 调度 开发工具
云桌面系统镜像文件快速分发方案分享SDK
为了解决云桌面环境下批量升级系统镜像的效率问题,传统的1对多FTP/HTTP方式因服务器带宽限制导致传输慢。一种基于优化的Bittorrent协议的P2P解决方案被提出,利用P2P技术将文件切块并让终端互相分享,提高下载速度,尤其适合大文件如256GB分区镜像的分发。通过自定义IO接口、跳过校验、超大分块、多分块支持及局域网自建Tracker等功能,实现更快的传输和镜像更新,适用于系统镜像、游戏更新等领域。该方案已广泛应用于各行业,可根据不同场景定制优化。
67 1
|
5月前
|
NoSQL 开发工具 数据库
开发与运维测试问题之应用启动报 Can not load this fake sdk class 的异常如何解决
开发与运维测试问题之应用启动报 Can not load this fake sdk class 的异常如何解决
|
7月前
|
开发工具 CDN 容器
基于Html+腾讯云播SDK开发的m3u8播放器
周末业余时间在家无事,学习了一下腾讯的云播放sdk,并制作了一个小demo(m3u8播放器),该在线工具是基于腾讯的云播sdk开发的,云播sdk非常牛,可以支持多种播放格式。
237 1
|
6月前
|
缓存 算法 Java
反射埋点方案: 全局点击埋点代理OnClickListener SDK 编写
反射埋点方案: 全局点击埋点代理OnClickListener SDK 编写
33 0
|
6月前
|
API 开发工具
抖音sdk,抖音开发api接口
抖音sdk,抖音开发api接口