WebRTC实现多人通话-Mesh架构【保姆级源码教程】

news/2024/9/23 22:36:41/

Mesh_0">一、Mesh架构

WebRTC(Web Real-Time Communications)中的Mesh架构是一种将多个终端之间两两进行连接,形成网状结构的通信模式。以下是关于WebRTC的Mesh架构的详细解释:

  1. 基本概念:在Mesh架构中,每个参与者(或称为peer)都需要与其他所有参与者建立直接的媒体连接。例如,如果有A、B、C、D四个参与者,那么A需要分别与B、C、D建立连接,B也需要分别与A、C、D建立连接,以此类推。
  2. 带宽需求:在Mesh架构中,每个参与者都需要将自己的音视频流发送给其他所有参与者,同时也需要从其他参与者那里接收音视频流。因此,对于每个参与者来说,带宽需求会随着参与者数量的增加而线性增长。例如,如果每个音视频流占用1M带宽,那么每个参与者需要向其他三个参与者发送数据,总共需要3M上行带宽,同时从其他三个参与者接收数据,也需要3M下行带宽,即每个参与者总共需要6M上下行带宽。
  3. 优点:Mesh架构不需要服务器中转数据,充分利用了客户端的带宽资源,节省了服务器资源。此外,由于所有参与者都直接相连,因此网络延迟较低,实时性较好。
  4. 缺点:Mesh架构的缺点主要在于带宽消耗和客户端资源占用。由于每个参与者都需要与其他所有参与者建立连接,因此带宽消耗会随着参与者数量的增加而急剧增长。此外,为了建立和管理这些连接,客户端也需要消耗大量的系统资源。另外,由于要向其他所有参与者发送数据,因此在同等带宽条件下,支持的多人通话路数就相对有限,视频质量(码率)也比较低。
  5. 适用场景:Mesh架构比较适合网络状况较好、人数较少(如3-4人)的小型会议场景。在大型会议或网络状况较差的情况下,可能需要考虑其他架构(如MCU或SFU)来优化性能和带宽使用。

总的来说,WebRTC的Mesh架构是一种直接、简单的通信模式,适用于小型、实时性要求较高的场景。但在大型会议或网络状况较差的情况下,可能需要考虑其他更复杂的架构来优化性能和带宽使用。

二、设计

如果你已经能熟练掌握1V1通话(http://t.csdnimg.cn/P8n3x),那么设计Mesh构架的多人通话将十分简单。下面我将逐步分析多人通话的整个“握手”过程。

以A、B、C、D四人通话为例。
在这里插入图片描述

  1. A发起offer,A、B、C、D分别创建3个RTCPeerConnection实例,A分别与B、C、D协商,协商成功后A页面有1个localVideo与3个remoteVideo,实现多人通话
  2. A发起offer后,B、C、D仅与A协商,B、C、D页面分别有1个localVideo与1个remoteVideo,仅仅实现了单人通话。
  3. A发起offer后,B发起offer,A与B已经通话跳过协商,B与C、D协商,此时B页面有1个localVideo与3个remoteVideo,实现多人通话
  4. A发起offer后,B发起offer后,C、D分别有1个localVideo与2个remoteVideo,未实现与所有人通话。
  5. A发起offer后,B发起offer后,C(或D)发起offer,C跳过已经建立的A、B协商,仅仅与D协商,最终A、B、C、D都实现了对话房间的所有人通话。

以上过程4个用户供发起了3次(n-1)次offer,共协商了6次(n*(n-1)/2)。

三、实现

  1. 根据对话房间人数动态创建RTCPeerConnection实例与remoteVideo。
  2. 对端用户ID分别与RTCPeerConnection、remoteVideo建立映射。
  3. 信令服务器跳过已经建立通话的offer。

多人通话效果见下图:
在这里插入图片描述

需要源码与教学的请私信我(* ̄︶ ̄)


http://www.ppmy.cn/news/1455885.html

相关文章

/swagger/index.html#/ 的页面可能存在问题,或者已永久移动到新的网址。

问题背景 在golang的项目中,使用了swagger。在另外一个项目中也使用了swagger,没有发生过这个问题。新的项目中,用了和之前项目同样的web框架,仔细比对了和之前项目的差异,只不过,目录结构做了调整,所以&a…

VBA删除Excel工作表空白单元格、行和列

还在手动挑选、删除Excel工作表中的空白单元格、行和列吗?VBA帮你快速搞定。 Excel工作表中因数据修改、删除等原因,造成出现很多空白单元格,或空白行和列,即影响表格美观又影响单位数据的统计,如何快速查找空白单元格、或删除空白行和列。VBA代码,让所有工作简便快捷,分…

C++ 中内存管理与不同部分划分

在 C 中,内存管理是一个非常重要的部分,尤其是在需要对性能进行优化的系统级编程中。C 提供了多种手段来控制内存的分配和释放,包括直接的内存操作和抽象的内存模型。虚拟内存的划分为多个部分,每个部分承担不同的功能&#xff1a…

开发Web3 ETF的技术难点

开发Web3 ETF(Exchange-Traded Fund,交易所交易基金)软件时,需要注意以下几个关键问题。开发Web3 ETF软件是一个复杂的过程,涉及到金融、法律和技术多个领域的专业知识。开发团队需要综合考虑上述问题,以确…

力扣69 x的平方根 二分查找求平方根 C语言

题目 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&…

Gradle基础学习(七) 认识插件

Gradle构建在一个插件系统上,本身主要由基础设施组成,比如有一个先进的依赖解析引擎,而其他功能则来自插件。 插件是提供额外功能给Gradle构建系统的软件组件。 插件可以被应用到Gradle构建脚本中,以添加新的任务、配置或其他与构…

【Unity】如何获得两个List各自的补集

【背景】 在项目中需要处理这样的逻辑,将所有活跃客户端的IP地址形成一个IP地址列表,与项目中已经生成按钮实例的IP按钮进行比照,如果某一个IP处于活跃状态,但是并未生成实例按钮,那么就生成实例。如果一个按钮的IP地址不存在于当前的IP地址列表中,则需要销毁这个Button…

力扣刷题:四数相加Ⅱ

题目详情: 解法一:暴力枚举 对于这道题,我们的第一思路就是暴力枚举,我们可以写一个四层的for循环进行暴力匹配,只要相加的结果等于0就进行统计。但是我们会发现,我们的事件复杂度为O(N^4)事件复杂度非常大…