天天看点

Android技术分享|视频通话开发流程(二)

作者:anyRTC云平台

多人呼叫

多人呼叫与点对点呼叫区别在于多人呼叫是一次呼叫1个以上的人,中途也可以再呼叫邀请别人加入通话。 整个呼叫的流程跟点对点呼叫类似,但也有些区别,需要添加额外的 API 逻辑来实现功能。下面我们分主叫被叫两种角色来分析。

主叫

发起呼叫

创建多个LocalInvitation 对象

val callArray = arrayOf("1234","5678","8888")
callArray.forEach {
  val localInvitation = rtmCallManager.createLocalInvitation(it)
  localInvitation.setContent("自定义的消息体")

//通常我们都会选择发送json格式字符串,例如
"mediaType":0 //0视频 1 音频
"isMeeting":0 //0 多人模式 1 p2p
"rtcChannelId":"10000"//⚠️这个参数尤为重要,这个参数通常都由主叫生成,在呼叫的时候带给被叫。该参数的作用是告诉对方我们这次呼叫将进入哪个 RTC 的频道,两个人进入同一个 RTC 频道时,音视频才会通。
"callUsers":callArray
 //发送呼叫
  rtmCallManager.sendLocalInvitation(localInvitation, null)
}           

多人呼叫跟和点对点呼叫一样,先创建 LocalInvitation,并且设置好必要的参数,只不过多人是需要创建多个,在这里我在自定义消息体里多加了一个 callUsers,将所有呼叫的人userId都带过去。这个可以让收到呼叫的人知道有哪几个人参与本次通话,并且可以根据这个数据提前加载好占位的View 并展示Loading动画,接通后并且通过接收该视频第一针回调后取消Loading动画。

这里需要注意的是要将创建好的所有 LocalInvitation放集合中保存,后面取消呼叫,中途邀请人都需要用。

加入RTM频道

这一步尤为重要,先说下加入 RTM 频道的作用。

主叫在发起多人呼叫后,紧接着应该加入频道,并且收到呼叫的人应该也第一时间加入RTM频道。之所以要这么做,是因为我们可以通过RTM 频道几个相当实用的回调,实现人员的添加移除管理。

//频道内总人数更新
void onMemberCountUpdated(int var1);

//有人加入频道
void onMemberJoined(RtmChannelMember var1);

//有人离开频道
void onMemberLeft(RtmChannelMember var1);           

onMemberLeft:前面我们已经知道,被叫收到呼叫,不论同意与否,都会会第一时间加入频道。如果被叫拒绝的话,不仅需要调用 rejectRemoteInvitation 还需要调用RTM channel的 Leave方法。调了 Leave ,所有加入 RTM 频道的成员都能知道这个用户离开了,不在需要额外的消息通知。

onMemberJoined:人员加入频道的回调,这个适用于如果中途邀请了别人加入通话,频道内的其他人同样会收到该用户加入 RTM 频道的回调,这时候就判断该用户是否有本地画面,如果没有可以在该回调添加这个人的视图。

onMemberCountUpdated:当RTM频道仅剩1个人的时候,这个时候就可以看作本次通话已经结束,执行相应的逻辑即可。

挂断

  1. 如果还有未接听的人员,主叫挂断需遍历 LocalInvitation 集合,再调用 cancelLocalInvitation 取消每一个呼叫对象。已接听的记得在LocalInvitation 集合中移除。如果业务逻辑是不区分主叫被叫,那么就不需要调用cancelLocalInvitation,即使发起人挂断,其他人还在的话,仍可以选择同意或拒绝加入通话。
  2. 调用 RTM 频道的 Leave ,其他人会收到 onMemberLeft,移除对应的视图。

异常处理

  1. 有人不在线
  2. 可以过滤不在线的用户,通过 queryPeersOnlineStatus查询对方状态。
  3. 接听超时
  4. 被叫迟迟不接听,会回调 onLocalInvitationFailure方法,在这里将其移除。
  5. 有人异常断线
  6. 被叫接听后异常断线,前面可知,收到呼叫就会加入 RTM 频道,如果异常断线后,其他人会收到 onMemberLeft回调,可在这里将其移除。

被叫

收到呼叫

在收到呼叫回调 onRemoteInvitationReceived后,首先要做的是 加入 RTM 频道,这样可以方便其他人处理逻辑,其次,主叫在创建 LocalInvitation对象的时候,加入了callUsers 字端,里面包含本次呼叫的所有人员信息。所以我们可以在此解析,并且保存下来,用于后面页面展示等其他业务逻辑。

同意

调用rtmCallManager.acceptRemoteInvitation(it, remoteInvitation)同意后,直接遍历 callUsers 在页面上展示每个人的Loading视图,再加入 RTC频道,等收到其他人加入 RTC后取消Loading即可。

拒绝

调用rtmCallManager.refuseRemoteInvitation(it, remoteInvitation)的同时,也需要离开加入的 RTM 频道。

挂断

  1. 未接听的情况下,先拒绝 refuseRemoteInvitation 本次呼叫邀请。
  2. 多人呼叫挂断无需再发送信令通知其他人,只需要离开之前加入的 RTM 频道,其他人即可 通过 onMemberLeft知道这个人挂断离开。

其他人离开

任何人离开都会先退出 RTM 频道,所以在 onMemberLeft里移除对应人员即可。

异常处理

其他用户一直未接听:

在 RTM SDK中,一个呼叫邀请的有效时间是60秒,所以,在展示其他人视图的时候,为其设置一个倒计时。期间,如果他 加入了RTC频道(意味着他同意了呼叫),就取消倒计时,隐藏Loading,展示他的视频即可。

如果倒计时结束还未收到他加入RTC的回调,直接移除。

总结

以上就是多人呼叫的大概流程,其中需要注意的地方就是,收到呼叫或者发起呼叫都要先加入 RTM 频道,

RTM频道的ID由主叫创建,被叫在 RemoteInvitation 中解析。挂断需离开RTM频道。

基于上述流程,开发者可以根据该流程并参考DEMO快速实现多人音视频呼叫通话。

Android技术分享|视频通话开发流程(二)

继续阅读