基于声网音视频SDK开发WebRTC2SIP Gateway的思路和步骤,一路填坑走出来的经验分享

转:https://rtcdeveloper.com/t/topic/16586

目录

1、基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 方案和思路

2、基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway报文设计

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

为什么做这个?

今年初接到一个项目任务,客户要求在自己的音视频平台系统中集成webrtc功能(原系统是基于SIP协议开发的,已经稳定运行多年,已有一定数量的存量客户)。在对比多家RTC产品的效果后,客户对声网音视频DEMO效果后非常满意,指定要求用声网的SD-RTN传输网络,全面改造客户端软件,改善音频通话质量。据客户实测,在某些国家和地区,同样网络环境下比微信的音频通话质量要好很多,比如在东非和中国之间语音通话,延迟很小、声音也更清晰。

目前系统已经上线运行了几个月没出过问题,通话质量也非常好,满足了客户的预期目标。公司要求总结开发阶段中碰到的问题,声网的小伙伴也说,我们公司的策略是培养ISV,把你们培养起来,做出解决方案,然后也希望能回馈一下社区,形成一个良性互动及不断加强一下社区浓厚的学习交流氛围。有感于这一段时间的开发工作,于是写下这篇文章,__我们会在这篇帖子中定期更新,分享开发思路、方案、遇到的问题、解决方法,希望能对大家有所帮助。__我会敲代码,不太会表达,如果大家在实现这个模块的过程中也碰到类似的问题,想了解一些细节,欢迎联系回帖提问或者邮箱交流(交流邮箱地址:bd@qzlink.com),咱们尽量答复大家。

一路走来,几个同事经常分析代码到半夜。终于在测试4个月后稳定下来。其实现在回头看,就是因为没有吃透声网的API文档,没有好好利用社区的功能。如果你碰到的坑是跟咱们的类似,那么花点时间仔细撸几遍API文档就可以搞掂了。

话不多说,先列下客户需求:

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天后拿出初步方案。

系统架构图 fsgui.com   webrtc2sip.com

解决思路有6步:

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个)。

PS:我们暂且把这个系统命名为 WebRTC2SIP Connector 或者SIP2WebRTC Connector吧。至于为什么这么叫,我也不知道,可能叫XX Gateway的太多了,不这么叫显不出声网的SD-RTN有多厉害,我是他爹,想叫什么都可以,哈哈

理清思路后,我们需要确认几个核心问题:

  1. 以哪个平台的SDK为基础开发WebRTC2SIP Connector核心模块?

  2. Agora SDK是否支持多并发呼叫?

  3. 声网的语音编码格式和视频编码格式是什么?采样率多少?

  4. SIP客户侧有没有什么具体的编码要求?客户可接受固定一个语音编码,我选择PCMA

这里特别感谢一下声网,对我们这种小众需求做出了快速响应,也感谢声网技术支持同学Nemo,专门来到公司交流了几个小时,并分享了一些技术信息,点一个大大的赞:grinning::grinning::grinning:声网建议我们:

  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、呼叫的具体流程大概是这样的:

(1)呼叫的时候,申请一个房间号,并根据自定义信令格式发起calling 报文,TCP Server收到后,转发给转接模块WebRTC2SIP ;

(2)WebRTC2SIP收到后创建1个线程,解析报文,并启动声网的SDK,加入指定房间号;

(3)开始读取音频流程,同时启动线程,封装SIP标准报文,发起sip invite请求给电话服务器SIP Server;

(4)SIP Server收到呼叫请求就去呼叫被叫电话号码,并返回ring振铃信号。

(5)WebRTC2SIP收到振铃信号,封装自定义的振铃信息给客户端SDK;

(6)被叫接听后,WebRTC2SIP,启动Media Coder开始解析媒体流,并resample 后,写入到声网的房间里面。实现语音通话。

3、从SIP呼入到声网的SDK,大同小异,反过来就行。

这里要注意:

1、每个终端都要自定义编号;

2、每个呼叫都要加入声网的房间channel 实现音视频互通;

3、因为编码不一样,所以需要resample,这个很重要,不然接通了没有声音,双方不匹配。

4、WebRTC2SIP模块要多线程方式处理,以实现并发呼叫;

5、WebRTC2SIP模块要维护一个完整的状态机,给每个通话加唯一编号,避免出错。

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

基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway报文设计

上一篇我们提到,常用的SIP 信令有:1注册、2振铃、3呼叫、4接听、5挂断、6取消

有了这几个报文,电话的呼入和呼出就可以基本实现,其他拒接、DTMF等类似。

如图所示:

 

 

约定:

  1. 客户端和服务器端JSON格式交互;

必传参数:msgtag 是消息唯一标志,userid是谁触发的,appid 作为一个应用的标记。sign 签名加密 (看情况)

  1. 服务器返回的报文必须包括msgtag \appid\errcode

errcode=1 说明有错误 errmsg就会有值 ,如果errcode=0 说明返回结果正确一般是返回的msgtag 是请求的msgtag+”_res”做为区分

  1. roomID 是房间号,对应声网的渠道号channel ID,每个通话报文必须包括roomID 用途是什么自己想。

  2. callType 是video \ audio前者代表视频呼叫,后者代表语音呼叫

  3. direction 呼叫方向in呼入 (SIP Server 把呼叫送到声网的SDK)out呼出(声网的SDK把呼叫送到SIP Server)

  4. isSIP YES / NO代表这通呼叫是内部呼叫(声网客户端实现) 还是SIP呼叫(走落地)

这篇文章我只是简单列出核心的报文DEMO格式。 

后续处理

不论客户端还是WebRTC2SIP Connector本质上都是声网的音视频SDK客户端,然后集成了自定义的信令报文,所以在初始化时,需要调用一个专门的的接口(暂时叫做initSIP),调用这个接口时传递type类型参数。

(1)如果是手机端或者电脑端、网页端调用,返回TCP Server地址和端口,供他们建立TCP连接。

(2)如果是Connector转接服务器请求,除了返回TCP Server地址和端口外,还要返回SIP Serve地址及端口和呼叫送号前缀。不然SDK发起电话呼叫时,Connector不知道电话要转送到哪里。这个开发一个http接口就可以实现。

APP初始化,调用initSIP接口,建立TCP连接,或者呼叫的时候在建立TCP连接;

TCP Server维持所有终端的状态及网络位置做Session Manager角色;

主叫输入的号码编辑封装calling报文,通过tcp socket发给服务器,同时UI呈现拨号等待页面;

被叫收到calling报文,就封装ringing报文,通过tcp socket 发给服务器,服务器查询Session Manager查询主被叫的IP和端口,实现消息的路由转发,主叫收到就显示振铃页面。同时WebRTC2SIP Connector启动Media coder线程去解析和resample读取到的音频流。就这样一个个的报文交互串起来,就可以实现整个SIP呼叫逻辑。有兴趣的同学,快去试试吧。

### 回答1: 基于SIP(会话发起协议)和WebRTC(Web实时通信)的音视频通话是一种先进的通信技术。 SIP是一种信令协议,用于建立、修改和终止多媒体通讯会话。它提供了一种灵活的方式,可以实现语音、视频、即时消息等多种通信媒体的传输。SIP基于IP网络,可以在各种网络环境下使用。 WebRTC是一种开放的实时通信技术,可以在网页浏览器中直接使用,无需安装插件或其他软件。它提供了实时音频和视频通信的能力,并支持数据传输和文件共享。WebRTC通过使用JavaScript API和RTCPeerConnection建立点对点连接,实现了浏览器之间的直接通信。 基于SIPWebRTC音视频通话结合了SIP的信令和WebRTC音视频传输能力。当两个或多个终端需要进行音视频通话时,首先使用SIP建立会话连接,并交换IP地址和端口信息。然后,使用WebRTC建立点对点的音视频传输通道,进行音频和视频数据的传输和实时编解码。 基于SIPWebRTC音视频通话具有很多优点。首先,它可以在各种终端设备上使用,包括计算机、手机和平板电脑。其次,它可以在不同的网络环境下使用,包括有线网络和无线网络。此外,它提供了高质量的音视频传输,具有低延迟和稳定性。 总的来说,基于SIPWebRTC音视频通话是一种先进的通信技术,能够实现高质量、实时的音视频通信。它在各种应用场景中都有广泛的应用,包括在线教育、视频会议、远程医疗等。 ### 回答2: 基于SIP(会话初始协议)和WebRTC(网络实时通信)的音视频通话是一种基于互联网的实时通信技术,可以在不同设备和平台之间进行高质量的音频和视频通话。 SIP是一种通信协议,用于建立、修改、终止多媒体会话,如音视频通话。它可以在IP网络上传输标准化的语音、视频和其他媒体数据。SIP使用URI(统一资源标识符)作为用户标识,并通过SIP服务器进行信令交换和媒体协商。 WebRTC是一组技术,允许网页和移动应用在不需要任何插件或额外软件的情况下,通过浏览器直接进行音视频通信。WebRTC使用了一些开放标准,如实时传输协议(RTP)和实时传输控制协议(RTCP)来传输媒体数据。 基于SIPWebRTC音视频通话有以下优点: 1. 跨平台支持:由于WebRTC是基于Web技术,可以在多种设备和平台上运行,包括PC、Mac、移动设备等。 2. 实时性强:音视频通话可以实时进行,避免了延迟和高延迟对通信的影响。 3. 便捷性:使用SIPWebRTC进行音视频通话不需要额外的软件和插件,用户只需要拥有一个支持WebRTC的浏览器。 4. 高质量:由于SIPWebRTC使用了先进的编解码算法和传输协议,音视频通话可以达到高质量的传输效果。 5. 安全性:SIPWebRTC提供了一些安全机制,如加密传输和身份验证,保护音视频通话的隐私和安全性。 综上所述,基于SIPWebRTC音视频通话是一种灵活、跨平台、实时性强、高质量和安全的通信方式,为用户提供了更便捷和高效的交流体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值