【音视频】Mesh、Mcu、SFU三种框架的总结
目录
三种网络场景介绍
【Mesh】
【MCU】(MultiPoint Control Unit)
【SFU】(Selective Forwarding Unit)
三种网络架构的优缺点
参考文章
三种网络场景介绍

【Mesh】
Mesh架构,需要所有参与连接的peer建立与所有其他peer的媒体连接。
该架构需要n-1个上下行,以此带来的带宽消耗(流量)、编/解码消耗(手机性能)成线性增长。
该架构只能适用3-4个人的小型会议场景。
【MCU】(MultiPoint Control Unit)
所有本房间的peer将本地媒体流推到远程媒体服务器,由媒体服务器进行混流,然后再推到所有连接的peer端。
该架构的优点就是只需要1路上下行,随着peer人数不断增加,依然不会对用户造成带宽、手机性能影响。
该架构将压力转嫁到服务端,由专用媒体服务器来完成混流,转推等功能。
【SFU】(Selective Forwarding Unit)
相对于MCU来说SFU只做转发,媒体服务器压力有限。与mesh架构相比,只需要n-1个下行,1个上行。
在大规模的场合该架构具有伸缩性。
三种网络架构的优缺点
Mesh架构
Mesh架构流量或带宽要求比较大,Mesh架构是利用Webrtc对等连接,在参与会议的各方之间开辟UDP通道,也就是两两进行P2P连接,把媒体流发给参与会议的各方,同时从参与会议的其它方获取媒体流,如上图四个参与方,总共8个连接,如果每个通道占用1M带宽,那每个端需要把自己的流发给其它三个端,也就是上行是3M带宽,同时从其它3个端获取流,也就是下行3M带宽,这样每个端上下行总共6M带宽;
Mesh架构对端的能力要求也是比较高,毕竟参与会议的各方的媒体流的编解码都是在端上面来处理的,图上面的4个参与会议方,那每个端的处理量就是4;结合上面可以看出Mesh一个端能承受的同时开视频的人员更少
Mesh架构不利于媒体的集中处理;例如媒体的录制,你如果不觉得带宽或者流量是问题,再从端上传一份媒体到存储服务器那又另当别论;又或者小哥哥小姐姐直播了一些不该直播的无法进行识别或处理了;再者集成我大讯飞的翻译咋办?不能没有我大讯飞的翻译啊,当然端上做也是可以的,但是毕竟端上算力是有限的;
但是Mesh实现起来技术难度是最小的,实现起来最简单;Mesh架构对服务器资源占用是最小的,只需要一个ICE服务器用来实现P2P穿越就行了,Mesh架构是真正的去中心化,对服务器资源占用是最小的,还有可以充分的利用了端上的算力,边缘计算的时代已经来了,节省不少成本;
MCU架构(MultiPoint Control Unit)
MCU架构对服务器端压力比较大,MCU架构需要一个中心化的MCU服务器,编码、转码、解码、混合都在服务器端做;
如上图MCU架构下的参会的4个端把自己的媒体流上缴到MCU服务器,然后MCU服务器对4个媒体流解码后进行合并,4个流合并成一个媒体流,再发给4个参会人员;因此服务器的压力特别大;所以单台服务器能承受的参会人员特别少,当然一些财大气粗的企业可以加服务器,加高级的GPU
MCU端上各种控制更加复杂 ,现在我和漂亮小姐姐聊天,小姐姐是我日思夜想的,我现在想把她的画面调大,这个实现起来就很麻烦了,因为下发的媒体流是合并的,也就是一个视频流;当然不是不可实现,通过信令服务器下发一个重新合屏的信令我们还是可以看到清晰的小姐姐的画面的;只是相对来讲实现更麻烦;
又比如我希望参会的小姐姐们看到群里最靓的我,那我对我自己上滤镜美白那可就麻烦了
MCU架构占用带宽最小,从前面的描述和从上图中我们可以看到4个参会人员每个人上交一份媒体流如果还是按照1M来算,那上行每个端1M,同时从服务器端获取一份混合过的媒体流还是按照1M算,那每个端上下行总共就是2M;结合上面所述MCU架构
一个端同时能承受更多的人开启视频
SFU架构(Selective Forwarding Unit)
SFU架构服务端压力相对较小,SFU架构看似和MCU一样都有一个中心化的服务器,但是SFU的服务器只负责转发媒体或者存储媒体;不直接做编码、转码、解码、混合这些算力要求较高的工作;SFU服务器接到RTP包后直接转发;
SFU架构占用带宽适中,例如上图,SUF架构参与会议的4个端每个端首先要把自己的流发给服务器,所以每个端上行1M带宽,同时从服务器获取转发过来的其它3个参会人员的媒体流也就是下行3M,这样每个端上下行加一起就是4M;所以它占用端上的带宽在Mesh架构和SFU之间;这种适中的带宽占用在即将到来的5G时代你可以想象!!!!
SFU架构对端和媒体流的控制更简单,还是上面的场景,我想仔细端详日思夜想的小姐姐将她的画面调大,只需要在端上直接放大就行了;另外整个会议中只让我成为最靓的仔,进行美颜啥的实现起来也不算是啥问题了,虽然对端的要求高,但是现在手机或者电脑算力过剩啊,边缘计算发挥到极致,哈哈……,为企业省钱
总结
互联网时代要求更个性化的体验(美颜,更个性化的控制等等),更大的容积率(也就是更多的用户同时在线);总的来说SFU架构更适合互联网时代;ZOOM会议和腾讯会议这两个比较出名的互联网会议系统都是SFU架构;所以跟风一波后续深入的研究SFU架构;
虽然SUF架构对端的算力要求比较高,更多的计算放到了端上,不过在视频会议或者直播的场景下面,跟多的是一个大画面,其它若干个小画面,而且通过交互控制,例如:同时只显示若干个小画面,滚动的时候动态的再获取其它的参会人员的视频生成小画面;
SFU只负责转发流,所以更高的并发,同时它逻辑简单,更容易的构建高负载架构
参考文章
一文带你了解webrtc基本原理(动手实现1v1视频通话)_go webrtc-CSDN博客
Webrtc音视频会议之Mesh/MCU/SFU三种架构_webrtc_千里授渔-即构开发者社区 (csdn.net)
相关文章:
【音视频】Mesh、Mcu、SFU三种框架的总结
目录 三种网络场景介绍 【Mesh】 【MCU】(MultiPoint Control Unit) 【SFU】(Selective Forwarding Unit) 三种网络架构的优缺点 Mesh架构 MCU架构(MultiPoint Control Unit) SFU架构(Selective Forwarding Unit) 总结 参考文章 三种网络场景介绍 【Mesh】 Mesh架构…...
高级算法设计与分析(四) -- 贪心算法
系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 高级算法设计与分析(四) -- 贪心算法 高级…...
MATLAB - 机器人逆运动学设计器(Inverse Kinematics Designer APP)
系列文章目录 前言 一、简介 通过逆运动学设计器,您可以为 URDF 机器人模型设计逆运动学求解器。您可以调整逆运动学求解器并添加约束条件,以实现所需的行为。使用该程序,您可以 从 URDF 文件或 MATLAB 工作区导入 URDF 机器人模型。调整逆…...
使用OpenCV DNN模块进行人脸检测
内容的一部分来源于贾志刚的《opencv4应用开发、入门、进阶与工程化实践》。这本书我大概看了一下,也就后面几章比较感兴趣,但是内容很少,并没有想像的那种充实。不过学习还是要学习的。 在实际工程项目中,并不是说我们将神经网络…...
C#中使用OpenCV的常用函数
以下是一些C#中使用OpenCV的常用函数例子: 1. 加载图像: using OpenCvSharp;Mat image Cv2.ImRead("path_to_your_image.jpg", ImreadModes.Color); 2. 显示图像: Cv2.NamedWindow("Image Window", WindowFlags.Nor…...
使用Swift Package Manager (SPM)实现xcframework分发
Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器,用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…...
非阻塞 IO(NIO)
文章目录 非阻塞 IO(NIO)模型驱动程序应用程序模块使用 非阻塞 IO(NIO) 上一节中 https://blog.csdn.net/tyustli/article/details/135140523,使用等待队列头实现了阻塞 IO 程序使用时,阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了 O_NONB…...
Android应用-flutter使用Positioned将控件定位到底部中间
文章目录 场景描述示例解释 场景描述 要将Positioned定位到屏幕底部中间的位置,你可以使用MediaQuery来获取屏幕的高度,然后设置Positioned的bottom属性和left或right属性,一般我们left和right都会设置一个值让控制置于合适的位置࿰…...
Django 简单图书管理系统
一、图书需求 1. 书籍book_index.html中有超链接:查看所有的书籍列表book_list.html页面 2. 书籍book_list.html中显示所有的书名,有超链接:查看本书籍详情book_detail.html(通过书籍ID)页面 3. 书籍book_detail.html中书的作者和出版社&…...
C++内存管理和模板初阶
C/C内存分布 请看代码: int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)mallo…...
QtRO(Qt Remote Objects)分布式对象远程通信
一、什么是QtRO Qt Remote Objects(QRO)是Qt提供的一种用于实现远程对象通信的机制。 QtRO支持两种类型的通信:RPC(远程过程调用)和LPC(本地进程通信)。 RPC(远程过程调用…...
【K8s】1# 使用kuboard-spray安装K8s集群
文章目录 搭建k8s集群1.推荐配置1.1.服务器配置1.2.软件版本 2.使用Kuboard-Spray安装k8s集群2.1.配置要求2.2.操作系统兼容性2.3.安装 Kuboard-Spray2.4.加载离线资源包2.5.规划并安装集群2.6.安装成功2.7.访问集群 3.涉及的命令3.1.linux 4.问题汇总Q1:启动离线集…...
leetCode算法—12. 整数转罗马数字
12. 整数转罗马数字 难度:中等 ** 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即…...
使用OpenCV4实现工业缺陷检测的六种方法
目录 1 机器视觉2 缺陷检测3 工业上常见缺陷检测方法 1 机器视觉 机器视觉是使用各种工业相机,结合传感器跟电气信号实现替代传统人工,完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成,…...
Excel 获取当前行的行数
ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发...
R语言【stringr】——str_detect 检测是否存在字符串的匹配项
Package stringr version 1.5.1 str_detect(string, pattern, negate FALSE) 参数【string】:输入向量。既可以是字符向量,也可以是强制作为一个字符向量。 参数【pattern】:要寻找的模式。默认解释为正则表达式,如 vignette(&…...
【SpringMVC】SpringMVC的请求与响应
文章目录 0. Tomcat环境的配置1. PostMan工具介绍创建WorkSpace建立新的请求 2. 请求映射路径案例结构与代码案例结构案例代码 案例存在问题解决方案方法方法升级版——配置请求路径前缀注解总结 3. Get请求与Post请求案例结构与案例代码案例结构案例代码 Get请求Post请求接收中…...
Spring Boot3通过GraalVM生成exe执行文件
一、安装GraalVM 1、官网:https://www.graalvm.org/downloads/ 2、配置环境变量 2.1、环境变量必须使用JAVA_HOME,否则会出现问题 2.2、在系统变量配置Path,%JAVA_HOME%\bin,注意必须放在顶部第一位 2.3、配置jdk的环境变量,在P…...
【Amazon 实验②】使用缓存策略及源请求策略,用于控制边缘缓存的行为及回源行为
文章目录 1. 了解缓存策略和源请求策略1.1 使用缓存键和缓存策略 实验:使用CloudFront缓存策略和缓存键控制缓存行为 接上一篇文章【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发,我们现在了解和配置如何使用缓存策略及源请求策略,…...
达梦数据对比工具的部署与使用
1、拷贝达梦软件bin目录到Oracle服务器(root用户) 压缩Linux rh6 x86版本的达梦数据库bin目录,例如压缩文件为dmbin.tar.gz,将文件拷贝到Oracle服务器指定目录并解压(如:/home/oracle/dmbin)&a…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
