WebRTC → 多人通讯架构浅析

news2025/8/14 21:02:21

1、一对一通信模型


一对一通信中,WebRTC会先尝试两个终端之间是否可以通过P2P直接进行通信,无法通信时会通过STUN/TURN服务器进行中转;其中STUN/TURN服务器的作用在不能直连时是中继服务器,通过该服务器进行端到端之间的数据中转;当可以直连时STUN/TURN的作用就只是用于各端收集reflx类型的Candidate; 原则是尽可能让双端进行直连,这样既可以节省服务器的资源,又可以提高音视频服务器的质量;
  • 1v1通信连接过程图解

即是端A与端B之间的Offer信息的本地存储与远端发送,从而打通双端的基本信息交换

2、通信架构分析


2.1P2P

端与端之间直接通信,适合两人通信场景,可以理解成Mesh,Mesh是标准P2P通信模式的混用

2.2Mesh方案/架构

多个终端之间共享媒体数据时需要同时向其他端发送对应的数据;

TURN Server是指支持TURN协议的服务器,扮演者一种网络中继的角色,支持将一个client的数据包透明的转发到多个其他的Client客户端

2.3图解Mesh架构图

  • 终端浏览器之间两两相连,还分别与STUN/TURN服务器进行连接,此时STUN/TURN服务器不会进行数据中转;

  • 单方面进行音视频数据共享时,需要将共享的数据分别发送给其他端,从而实现多人通信

  • 优势

  • 不需要服务器中转数据,STUN/TURN只负责NAT穿越,不需要再单独开发一套美体服务器,利用现有的WebRTC通信模型就可以实现

  • 充分利用了客户端的宽带资源

  • 节省服务器资源,不需要其他的数据处理和中转

  • 基础的信令服务器还是要用的

  • 劣势

  • 当有过多的终端进行音视频流共享的时候,需要向每个终端进行共享,此时占用的宽带、CPU、Memory等资源也就不断变大,一般人数超过4人时就会出现问题

  • Mesh架构是依赖于大多数终端都可以直连的情况下的,当有终端不能实现NAT穿越时就会出现较复杂的打通逻辑

  • 每新增一个客户端,所有客户端都需要新增一路数据上行,客户端上行带宽占用太大,通话人数越多,效果越差

2.4MCU方案/Mixer架构

接收每个共享端的数据时会进行解码、与其他端解码后的数据进行混合,重新编码,之后再讲混合后的音视频数据发送给房间内的所有人; 是在SFU的基础上将 多路流在服务器进行合流后再转发给终端,从而将多路下行合并成一路下行流,进一步减少宽带,但会增加服务器压力

2.5图解MCU方案

MCU方案中的MCU( 多点控制单元:接收并混合每个客户端传入的媒体流-将多个客户端的音视频画面合成单个流,再传输给每个参与的客户端)相当于是 中转器,将共享者发送的数据进行解码、混合、编码等操作后将数据发送给接收端,同时共享端之间也是将除本端的数据外都进行不处理直接推送到各发送端;

2.6MCU处理逻辑图

  • 处理过程分析

  • 接收共享端发送的音视频流数据

  • 解码接收到的音视频流数据

  • 对视频流进行重新布局、混合处理

  • 对音频流进行混音、重采样处理

  • 将混合后的音视频进行重新编码

  • 将编码后的数据发送给客户端

  • 优点

  • 缓解了Mesh架构中的问题(多端时宽带压力较大)

  • 非常成熟,在硬件音视频会议中应用广泛

  • 通过重新的编解码和数据流二次操作可以适配更多的终端

  • 通过将多共享端的数据混合成一路,可以使得所有人看到的数据是相同的画面,同时对客户端的压力也是最小的

  • 劣势

  • 对数据流的编解码和二次处理会加大对CPU网络的消耗,且更容易导致视频流的延迟

  • 对服务器压力最大:

  • 需要提供一个中心化的MCU混流服务器,所有媒体流的解码、编码、转码、混合都在服务器端完成

  • 自定义布局复杂:

  • 一般情况下MCU服务器仅混合编码一路合并后的媒体流,不论有多少参会者,看到的画面都是一致的,要想某个人想改变视频画面布局,比如放大或关闭某一人的视频画面通常是无法满足的,除非定义单独的信令逻辑,请求MCU服务器单独编码一路流发送给特定需求的参会者;

2.7SFU方案/Router架构

SUN可以理解成一个路由器,接收终端的音视频流,再转发到其他终端,支持WebRTC的 媒体服务器基本都是SFU结构; SFU结构中的每个终端都会共享一路流分发给SFU,SFU会将每一路流都转发给除共享者之外的其他端; 全称是Selective Forwarding Unit,终端只需发送一路上行流到服务器,通过服务器俩路由和转发给其他终端,避免 mesh中终端多路上行产生的宽带压力

  • 和Mixer架构类似,只是Router架构只是单纯的进行数据流的转发,不用合成、转码等操作;

  • SFU会根据终端下网络状况做一些流控,可以根据当前宽带情况,网络后延迟时会选择性的丢弃一些媒体数据,保证数据的连续性

  • 优势

  • 数据包是直接转发,不需要解码、编码等操作,对CPU等资源的消耗小;,服务器压力和成本降低

  • 直接转发也极大的降低了延迟,提高实时性;

  • 具有灵活性,多路媒体流可以进行自定义

  • 劣势

  • 由于数据包直接转发,参与人观看多路流可能会出现不同步,相同的流也有可能画面不一致

  • 客户端加码压力大:

  • 每个客户端需要解码n-1路媒体流,和Mesh架构类似

2.8 如何实现SFU

SFU的职责之一是接收和发送RTCP数据包,RTCP数据包包括关于音频和视频流的不同类型的反馈,且最重要的RTCP数据包时接收器报告(RR:数据包从媒体流接收器发送到该媒体流的发送者); 在SFU情况下,RR由SFU产生,并发送到媒体流发送器,并且还从每个流接收器发送到SFU;

SFU的核心功能是基于WebRTC protocol与终端建立连接,接收终端上传的视频流,并将其转发给其他终端 - 重点在于实现WebRTC protocol的能力,可以将其拆解为两部分工作:
  • 信令服务:在SFU服务器与终端之间传输WebRTC protocol中的SDP数据和ICE数据,提供简历WebRTC连接的相关信息

  • 流媒体服务:在SFU服务器与终端之间基于WebRTC protocol传输视频流数据

信令服务

信令服务需要传递的SDP和ICE两种数据,但SDP又分为Offer和Answer两类数据,所以需要提供三个信令
  • 三个信令

  • Offer

  • Answer

  • Candidate

  • 信令格式是JSON格式,两个字段,一个表示区分信令,另一个字段携带数据

typeMessagestruct {

Eventstring`json:"event"`

Datastring`json:"data"`

}

  • WebRTC客户端与SFU服务器需要协商的点

  • ICE建联:交换ICE信息(用户名、密码、IP地址、UDP端口等)

  • 发布流/取消发布流(Publish):客户端通知服务器准备好接收数据

  • Publish:添加一个逻辑上的Producer,通过UDP通道recv客户端的数据,通知逻辑上的Consumers

  • 订阅流/取消订阅流(Subscribe):客户端通知服务器准备好转发数据

  • Subscribe:添加一个逻辑上的Consumers,接收到Producer通知后,通过UDP通道send给客户端

  • 传输协议选择WebSocket

  • 实现one-to-more,最主要的就是将数据的生产者和消费者关联起来,关联方法就是通过RTP包头中的xxxC(同步源标识)

  • WebRTC传输的音视频数据,实际是封装在RTP包里面

  • 实现one-to-more的核心代码逻辑抽象是:SFU接收到Publish发送上来的数据后,轮训一下所有的Subscribers,如果xxxC匹配成功后,则将数据转发给这个客户端

流媒体服务

流媒体服务需要实现WebRTC protocol中定义的connectioning,securing,communicating的能力,需要用到pion库,其已经提供了使用golang实现的WebRTC protocol,其主要接口已WebRTC API基本一致

2.10 Simulate模式

是指视频的共享者可以同时向SFU发送多路不同分辨率的视频流(一般为3路流,1080P、720P、260P),而SFU会根据各端的情况选择一路流发送出去;

2.11 SVC模式

SVC是可伸缩的视频编码模式,与Simulate模式的同时传多路流不同,SVC模式是在视频编码时做手脚; 在视频编码时将视频分为多层,核心层、中间层和拓展层,上层依赖下层,越上层越清晰,在网络较好时可以将三层都发送出去,不好时将最底层发送出去;

3、总结


SFU是三种架构方案中优势较明显而劣势相对较少的一种架构方案 SFU相比于MCU,服务器的压力更小(纯转发,无转码合流),灵活性更好(可选择性开关任意路数据的上下行等),受到更广泛的欢迎和使用,当然在更复杂的生产环境下可能会将SFU和MCU会混合使用

4、多端通信


4.1 原理分析

常规的直播基本属于1V多,只有一端输出视频流,其他端只需要接收就好,这种方式一般通过服务端进行媒体流的转发

4.2 注意事项

  • 如何给每个客户端创建多个点对点连接

  • 两两之间的连接都是单独创建的Peer实例,从而保证每个端之间的Peer是一一对应的

  • 如何保证连接的顺序性

  • 在1v1中明确的存在呼叫端和接收端

  • 1v1中创建Peer实例的时机是:接收端点击同意通话后,初始化自己的Peer实例;呼叫端接收到对方同意申请的通知后,初始化自己的Peer实例,并向其发送Offer

  • 在多人直播的场景中规定后加入房间的成员向房间内所有已加入的成员分别发送Offer,以此保证时序性

5、拓展


5.1、WebRTC - SFU - 推流简介

  • 大体流程

  • 通过STUN协议获取对方的公网IP和端口

  • STUN(Simple Traversal of User Datagram Protocol Through Network Address Translators),即简单的通过UDP穿越NAT,是个轻量级的协议,是基于UDP的完整的穿透NAT的解决方案;

  • NAT穿透(NAT Traversal):在进行P2P通信之前,需要进行检测以确认主机之间能否进行P2P通信以及如何通信,这种技术称为NAT穿透

  • STUN协议主要做了两件事:检测NAT类型和获取NAT分配的公网IP和端口

  • 通过DTLS协议进行握手,设置加密信息等

  • 通过RTP和RTCP协议进行数据的传输和数据状态的上报和获取

原文https://juejin.cn/post/71881277

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据挖掘多模块接口(二分类)python旗舰版

数据挖掘任务一般分为四大步骤:1、数据预处理2、特征选择3、模型训练与测试4、模型评估本文为四大步骤提供接口,使得能够快速进行一个数据挖掘多种任务中,常见的二分类任务。0. 导包0.1 忽略警告信息:import warnings warnings.fi…

【Java学习笔记】2.Java 开发环境配置

Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境。 window系统安装java 下载JDK 首先我们需要下载 java 开发工具包 JDK,下载地址:https://www.oracle.com/java/technologies/downloads/,在下载页面中根据自己的系统选…

企业寄件现代化管理教程

现代化企业为了跟上时代发展的步伐,在不断完善着管理制度,其中公司寄件管理,也是重要的一个模块。为了提高公司快递的寄件效率,以及节约寄件成本,实现快递寄件的规范化,越来越多的现代化企业,开…

ES linux 环境下安装问题集锦

1: 所有的环境配置安装完成后验证: curl -u elastic http://127.0.0.1:9400 输入密码;2:错误1:解决方法:配置连接的用户名与密码; 重启ES 错误2:[1]: max number of threads [2048] …

前端性能优化:浏览器的2种缓存方式,你了解吗?

在前端性能优化中,最重要的就是缓存,使用缓存可以极大的提升浏览器的响应速率。什么是缓存呢?当我们第一次访问某个网站时,浏览器会把网站中的图片等资源存储在电脑中,以备后续使用,第二次访问该网站时&…

c++继承机制

4-4继承(带参构造)_哔哩哔哩_bilibili 继承机制 4.1继承与派生的概念 继承 是指在已有类或称为基类的基础上创建新类,这个新类就是派生类。 单继承:由一个基类派生的类 多继承:由两个或多个基类派生的类 派生类的…

【Windows】【Linux】---- Java证书导入

问题: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 无法找到请求目标的有效证书路径 一、Windows—java证书导入 1、下载证书到本地(以下…

理解Transformer

Transformer总体框架: 1、Encoder Encoder由 6 层组成,每一层包括两个子层:第一层 multi-head self-attention 层(8个heads),第二层是一个简单的全连接前馈网络。在每个子层后都接了一个残差连接以及归一化…

Linux命令行安装Oracle19c

安装 下载 从 Oracle官方下载地址 需要的版本,本次安装是在Linux上使用yum安装,因此下载的是RPM。另外,需要说明的是,Oracle加了锁的下载需要登录用户才能安装,而用户是可以免费注册的,这里不做过多说明。 …

JavaScript简述

JavaScript简述JavaScript简介JS用法JavaScript输出window.alert()document.write()innerHTML()console.log()JavaScript简介 JavaScript是脚本语言,可用于HTML和web。 …

Vue项目中引入高德地图步骤详解

高德地图API官网:高德开放平台 | 高德地图API。 目录 一、案例效果 二、开发准备 1. 注册高德开放平台账号 2. 创建应用添加 key 值 三、项目中使用地图组件 1. npm 获取高德地图 API 2.在项目中新建 MapContainer.vue 文件,用作地图组件。 3.在…

SpringBoot-运维篇

在运维实用篇中,是玩转配置,为开发实用篇中做各种技术的整合做好准备工作。与开发实用篇相比,运维实用篇的内容显得略微单薄,并且有部分知识模块在运维实用篇和开发实用篇中都要讲一部分,这些内容都后置到开发实用篇中…

python实现PCA降维画分类散点图并标出95%的置信区间

此代码以数据集鸢尾花为例,对其使用PCA降维后,绘制了三个类别的样本点和对应的置信圆(即椭圆)。先放效果图。 下面是完整代码: from matplotlib.patches import Ellipsedef plot_point_cov(points, nstd3, axNone, **…

Windows环境搭建Android开发环境-Android Studio/Git/JDK

Windows环境搭建Android开发环境-Android Studio/Git/JDK 因为休假回来后公司的开发环境由Ubuntu变为了Windows,所以需要重新配置一下开发环境。 工作多年第一次使用Windows环境进行开发工作,作次记录下来。 一、 Git安装 1.1git 标题软件下载 网址&…

CISA 告诉机构优先考虑什么以满足网络安全日志要求

随着联邦机构努力满足 2021 年发布的网络安全记录要求,政府的主要网络安全部门发布了一般指南,以帮助机构领导者优先考虑可能是昂贵且资源密集型实施的部分内容。 管理和预算办公室于 2021 年 8 月发布了一份备忘录,要求各机构创建和维护某些…

linux下nm,objdump和ldd三大工具使用

linux下进行C/C开发时经常需要使用nm&#xff0c;objdump&#xff0c;ldd工具来分析定位问题&#xff0c;本篇文章就对其做个总结&#xff1a; 1.测试程序 TestSo.h #pragma once #include <iostream>extern "C" int CTypeAdd(int x, int y); extern "…

关于Git分支高级合并的一些笔记整理

写在前面 分享一些 Git 高级合并的笔记博文为《Pro Git》读书笔记整理感谢开源这本书的作者和把这本书翻译为中文的大佬们理解不足小伙伴帮忙指正&#xff0c;书很不错&#xff0c;感兴趣小伙伴可以去拜读下 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&a…

传统图像处理方法实现车辆计数

本文通过传统OpenCV图像处理方法实现单向行驶的车辆计数。用于车辆检测的视频是在https://www.bilibili.com/video/BV1uS4y1v7qN/?spm_id_from333.337.search-card.all.click里面下载的。 思路一&#xff1a;来自B站某教程。大致是在视频中选取一窄长条区域&#xff0c;统计每…

【软件测试面试题】项目经验?资深测试 (分析+回答) 我不信你还拿不到offer......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在面试过程中&#…

Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作

场景 Sqlite数据库 SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其他数据库&#xff0c;SQLite 引擎不…