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

article/2025/10/13 5:59:25

多人呼叫

多人呼叫与点对点呼叫区别在于多人呼叫是一次呼叫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. 有人不在线

    可以过滤不在线的用户,通过 queryPeersOnlineStatus查询对方状态。

  2. 接听超时

    被叫迟迟不接听,会回调 onLocalInvitationFailure方法,在这里将其移除。

  3. 有人异常断线

    被叫接听后异常断线,前面可知,收到呼叫就会加入 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快速实现多人音视频呼叫通话。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/HRxAIFXd.shtml

相关文章

Web音视频通话解决方案 —— Agora Web SDK NG 版接入教程

引言 随着社会的发展,人们对实时音视频的需求越来越多。在线会议,电商直播,在线教育等相关产品不断涌现。但是对于个人开发者或者小团队来说,自己实现一个实时音视频服务并且要保障服务稳定,满足低延时等要求&#xf…

基于声网 SDK 实现 iOS 端的一对一视频通话

在很多产品,加入实时视频通话已经不是新鲜事情了,尤其是近几年的疫情影响,个人公司国家对于实时音视频的需求一直在快速的增长。例如视频会议、社交应用、实时游戏,甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网…

web端视频通话sdk集成和功能实现流程(实时视频系列五)

本文介绍的是在wed端如何集成即构音视频SDK,以实现在wed端一对一,一对多及多人实时视频通话的功能。 一、SDK集成指引 1、安装 请从 jZego-RTC-SDK 下载 SDK。 npm下载包支持typescript语言(推荐): npm i webrtc-zego 2、集成SDK 可使用s…

《保姆级教程》基于Agora SDK实现音视频通话及屏幕共享

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…

保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享

前言 大家好,我是 小曾同学,小伙伴们也可以叫我小曾~ 如果你想实现一对一音视频通话和屏幕共享功能,不妨来看看这篇文章,保姆级教程,不需要从零实现,直接集成声网 SDK 即可轻松上手。 本文也…

Android设备实现语音视频通话

一、背景 有智慧社区相关的项目,需要门禁开发门禁机APP以及用户端APP,要求实现门禁设备呼叫业主APP,业主接通后可以通话、可以开门。这里主要要做的就是语音和视频通话功能,以及远程开门。至于业务逻辑那就是正常的需求处理了。 …

基于 Web SDK 实现视频通话场景 | 声网 SDK 教程

声网视频 SDK 被广泛应用于多种实时互动场景中,例如视频会议、视频通话、音视频社交、在线教育等。为了让刚刚接触声网 SDK 的开发者,可以更顺畅地实现基础的视频通话功能,我们基于声网 Web SDK 4.x 版本梳理了本篇教程。 在本文末&#xff0…

如何基于 Agora Android SDK 在应用中实现视频通话?

在很多产品,实时视频通话已经不是新鲜的功能了,例如视频会议、社交应用、在线教育,甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频通话应用。声网 SDK 每个月会提供 10000 分钟的免…

Android uni-app实现音视频通话

前言 上一篇讲解了怎么实现Android uni-app封装原生插件,这篇讲解一下,把anyRTC的RTC(音视频通讯)封装uni-app 实现音视频通话。 不了解anyRTC的小伙伴,可以点击下面链接: 开发者官网 1.效果图 先上图&a…

使用 Agora SDK 开发 React Native 视频通话 App

在 React Native 的应用中,从头开始添加视频通话功能是很复杂的。要保证低延迟、负载平衡,还要注意管理用户事件状态,非常繁琐。除此之外,还必须保证跨平台的兼容性。 当然有个简单的方法可以做到这一点。在本次的教程中&#xf…

MySQL联合索引底层数据结构是怎样的

目录 1. 联合索引数据结构图 2.联合索引是如何进行排序的 3. 联合索引查询特点 1. 联合索引数据结构图 如下图所示联合索引的数据结构, 通过name,age,position三个字典进行一个联合索引,构建B树索引结构。 2.联合索引是如何进行排序的 B树…

MySQL联合索引在B+树如何存储以及寻址

文章目录 引入Innodb B树联合索引存储以及寻址总结 引入 最近找工作, 去一家三方支付公司面试,前面得过程还挺好,所有的提都回答对了(心里暗自窃喜应该能拿到高工资offer,迎娶白富美,然后走向人生巅峰&…

MySQL联合索引生效规则

最近项目中一张表数量测试达到千万级别,考虑加索引,对于单列索引及联合索引(复合索引)简单学习了下,做一下笔记。 联合索引生效前提:因为联合索引有顺序讲究,联合索引的第一个字段是引导列&…

mysql联合索引的数据结构

一、本文主要讲解的内容有: 联合索引在B树上的存储结构联合索引的查找方式为什么会有最左前缀匹配原则 在分享这篇文章之前,我在网上查了关于MySQL联合索引在B树上的存储结构这个问题,翻阅了很多博客和技术文章,其中有几篇讲述的…

mysql联合索引有效和失效的情况分析

关于mysql的索引,是mysql优化一个非常重要的方面。那么关于索引是否有效就是非常关键了。很多人设计了索引,但是发现依旧很慢。那么这个时候就判断sql的索引执行情况非常重要了。网上有大量的博主也写过不少类似的文章,但是关于联合索引的具体…

MySQL联合索引(abc)命中规则

1.建表 mysql创建一张表,表名:‘test_models’ id列为 主键,int类型 ,自增a,b,c,d,e 全部是int(11)为(a,b,c)添加一个联合索引 index_abc 执行语句: CREATE TABLE te…

mysql联合索引

mysql联合索引的使用 命名规则:表名_字段名 1、需要加索引的字段,要在where条件中 2、数据量少的字段不需要加索引 3、如果where条件中是OR关系,加索引不起作用 4、符合最左原则 以下是我的建表语句 CREATE TABLE test ( id int(11) uns…

mysql 联合索引结构与索引匹配原则

联合索引结构与索引匹配原则 最左前缀匹配原则:在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。 要想理解联合索引的最左匹配原则,先来理解下索引的底层原理。索引的底层是一…

详解MySQL联合索引

引言 本文预计分为两个部分:(1)联合索引部分的基础知识 在这个部分,我们温习一下联合索引的基础(2)联合索引部分的实战题 在这个部分,列举几个我认为算是实战中的代表题,挑出来说说。 正文 基础 讲联合索引,一定要扯最左匹配!…

mysql联合索引的使用

这篇笔记主要记录联合索引的使用 设置了shopId、userId、relationId三个字段,作为联合索引,这三个字段,都是long类型的,也就是bigint 分别验证以下几个场景: 场景一:explain select * from testIndex wher…