技术分享| 如何快速实现音视频在线通话
请问咱们支持像微信一样的音视频呼叫功能吗?
请问呼叫邀请怎么实现?
如果客户端离线了,怎么呼叫到客户?
怎么添加呼叫铃声?以及接收铃声?
经常能听到有用户问上述的问题,今天借此机会向大家讲解下音视频呼叫的整体流程。
前提
在接入 anyRTC SDK 前,先向大家介绍下音视频呼叫所需要的 SDK:视频通话 SDK、实时消息 SDK、第三方推送服务。
视频通话 SDK
视频通话 SDK,可实现一对一单聊、多人群聊,同时具备纯语音通话和视频通话功能。也可以实现一对一、多对多的音视频互动直播。其原理是进入同一个频道即可发布自己的音视频流并自动订阅其他用户的音视频流,进而实现音视频通话。
实时消息 SDK
实时消息 SDK,可以轻松实现点对点消息、频道消息、用户属性、频道属性和发起呼叫邀请、获取离线以及历史信息等功能。更可以自由拓展出更多丰富的功能,如禁言、踢人、权限管理等。其原理是在线用户的信令的发送与接收,通过信令交换来客户所需要的功能。
第三方推送服务
第三方推送服务,当集成了实时消息 SDK 的用户下线后,消息需要通过第三方推送服务才能送达,一般应用中都会集成推送服务,当实时消息用户下线后,通过推送服务也可以进行消息传递,实现音视频呼叫。
实现音视频呼叫功能,前提已经集成了视频通话 SDK、实时消息 SDK、第三方推送服务。
一对一呼叫
一对一呼叫邀请使用 RTM 的呼叫邀请接口进行:具体逻辑查看呼叫邀请文档,本章节结合呼叫邀请文档进行阐述。
流程:
用户登录 RTM-》选择需要呼叫的用户-》使用 RTM 方法判断用户是否在线-》用户不在线-》发送离线推送消息-》等待对方同意与否-》对方同意后-》使用 RTC 进入协商的频道进行通话。
用户登录 RTM-》选择需要呼叫的用户-》使用 RTM 方法判断用户是否在线-》用户在线-》发送 RTM 呼叫邀请消息-》等待对方同意与否-》对方同意后-》使用 RTC 进入协商的频道进行通话。
问题:
1、如何知道目前对方不在线?
在进行呼叫之前调用:queryPeersOnlineStatus方法进行查询用户是否在线,用户在线走 RTM 呼叫邀请方法,用户不在线使用推送服务进行消息传达。
2、推送消息如何做?呼叫端和被叫端怎么处理?
首先需要先集成第三发推送服务,客户端跟服务端都需要对应集成。
呼叫端在呼叫用户的时候,先判断对方是否在线,如果对方不在线,向自己的业务服务发送一条邀请消息,此时呼叫端播放铃声,业务服务收到客户端的邀请消息后,使用第三方推送提供的 RESTful API 接口向被邀请方发送该邀请消息,消息发送成功后,向呼叫端发送离线消息已发送成功,此时呼叫端做等待 60s 等待对方答复的逻辑。
被叫端收到推送消息,点击推送消息进入应用,判断消息类型为呼叫消息,进入等待同意通话页面并播放响铃。
如果被叫端点击挂断按钮,此时停止播放铃声,并发送一条拒绝的消息给呼叫方。呼叫方收到拒绝消息停止播放铃声,并在页面中给予一条提示:对方挂断。
如果被叫端点击同意按钮,此时停止播放铃声,并发送一条同意的消息给呼叫方,并初始化 RTC SDK 进入协商的通信频道。呼叫方收到同意的消息停止播放铃声,并初始化 RTC SDK 进入协商的通信频道。
3、呼叫时异常了该怎么处理?
一般的异常是信令都已送达,程序可能崩溃会导致流程进行不下去,一般有 2 中方式进行异常处理:
anyRTC RTM SDK 的订阅对方在线状态功能能够帮助开发者解决中间异常问题,如果收到对方下线,页面上做友情提示即可。
呼叫中每个状态都有超时回调,根据超时回调进行友情提醒或中断呼叫邀请。
4、响铃怎么处理?
推送铃声为推送消息的时候可自定义响铃的内容
发送呼叫等待铃声以及接收邀请后的响铃,Native 端可根据 SDK 的混音接口实现。
不建议使用系统自带的播放器去播放响铃,因为 SDK 的通话和音乐播放会对音频 Session 造成影响。
5、推送服务商有什么好的建议?
目前市面上的推送服务比如:个推、极光、友盟都是可以去集成的,Android 端的最好配置下主流的平台(华为、小米、OPPO、vivo、魅族等推送厂商通道)利用厂商的通道去推送,保达率会高很多。测试期间用免费的推送通道即可,上线后建议去购买他们的商业版本服务。
一对多呼叫
一对一的呼叫流程是使用 RTM 呼叫管理接口进行完成,如果进行一对多呼叫,需要使用 RTM 点对点消息,自定义信令进行消息投递,中间环节跟 RTM 呼叫管理接口使用无异。
注意事项
呼叫多人的时候,需要对每个人进行点对点发送消息,发送消息前,同样的要用 RTM 检测对方是否在线,对方不在线发送推送消息,对方在线发送点对点消息。
呼叫后,如果对方在线需要订阅对方的在线状态。
发送消息后,同样也做 60s 倒计时等待。
问题
1、通话中的邀请功能怎么实现?
多人呼叫场景中,还会有通话过程中邀请其他人加入,该操作流程跟前面的一对多呼叫流程保持一致即可。
2、通话中的会控功能如何实现?
可以使用 RTM 点对点消息,发送自定义消息,只需要协商好信令内容,识别对应的指令即可。
总结
上述呼叫流程 anyRTC 已开源到Github,开发者可参考该流程快速实现音视频在线通话。该开源项目包含的平台有 iOS,Android,Web 和 uni-app,功能暂未包含推送功能,推送功能可参考本文描述自行添加。
全真互联网时代的当下,文字交流已经无法满足快节奏的生活现状,越来越多的应用在加入实时互动功能,实时交流已是大势所趋。iOS 的 CallKit 框架最近也有松动的迹象,微信最新版本也已经开始灰度测试,相信该功能将会在国内全部开发,让国内的苹果用户享受电话级音视频音视频通信。Android 的推送诟病也会慢慢消除,安卓统一联盟会慢慢把推送标准统一,功耗更低、集成更便捷、保达率更高的推送机制即将来临。
版权声明: 本文为 InfoQ 作者【anyRTC开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/f3568b185f0a1a3ba722ff2a1】。文章转载请联系作者。
评论