webrtc获取IceCandidate流程

在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释:

一、ICECandidate的定义

ICECandidate对象通常包含以下关键属性:

  • foundation:用于唯一标识候选者的基础信息,通常是基于候选者的类型、IP地址、协议和replay协议计算出的字符串。

  • component:标识候选者所属的传输组件。对于RTP流,通常使用1;对于RTCP流,通常使用2。

  • protocol:候选者使用的传输协议,通常是UDP,但也可以是TCP(尽管在WebRTC中UDP更为常见)。

  • priority:候选者的优先级,用于在选择最佳候选对时进行比较。优先级的计算公式考虑了候选类型优先级、本地优先级和组件ID。

  • address:候选者的IP地址。

  • port:候选者使用的端口号。

  • type:候选者的类型,包括host、srflx、prflx和relay四种,优先级依次由高到低。

    • host:直接连接到本地网络接口的地址,未经过NAT(Network Address Translation,网络地址转换)转换。
    • srflx(Server Reflexive):通过STUN(Session Traversal Utilities for NAT)服务器获得的NAT映射地址。
    • prflx(Peer Reflexive):在尝试与对等体建立连接时通过STUN响应动态发现的地址。
    • relay:通过TURN(Traversal Using Relays around NAT)服务器中继的地址,用于在对等体之间转发数据。
  • relatedAddress(可选):对于反射(srflx)和对等体反射(prflx)候选者,这是映射到候选者地址的内部IP地址和端口。

  • tcpType(可选):如果候选者使用TCP协议,则指定TCP类型(例如,active、passive、so)。

二、ICECandidate的作用

ICECandidate在WebRTC中主要用于收集、交换和测试潜在的通信端点,以便在复杂的网络环境中(如存在NAT或防火墙时)建立和优化点对点连接。

  • 收集候选者:WebRTC客户端会收集本地网络接口的地址(host候选者)、通过STUN服务器获得的NAT映射地址(srflx候选者)、以及通过TURN服务器获得的中继地址(relay候选者)。
  • 交换候选者:通过信令系统(如WebSocket、SIP等),WebRTC客户端会交换彼此收集到的候选者信息。
  • 测试候选对:WebRTC会使用STUN协议发送Binding请求来测试候选对之间的连通性。成功建立连接的候选对将被优先考虑用于传输媒体数据。

三、ICECandidate的优先级和选择

WebRTC在选择最佳路径来传输媒体数据时,会基于候选对的优先级和连通性测试结果进行决策。如果直接P2P连接无法建立,则可能会回退到使用TURN服务器进行中继。候选者的优先级计算公式考虑了多种因素,以确保在选择最佳路径时能够综合考虑各种条件。

整个流程如下:

 IceCandidate的生成发生在offer生成后,重点在:

void P2PTransportChannel::MaybeStartGathering() {RTC_DCHECK_RUN_ON(network_thread_);// TODO(bugs.webrtc.org/14605): ensure tie_breaker_ is set.if (ice_parameters_.ufrag.empty() || ice_parameters_.pwd.empty()) {RTC_LOG(LS_ERROR)<< "Cannot gather candidates because ICE parameters are empty"" ufrag: "<< ice_parameters_.ufrag << " pwd: " << ice_parameters_.pwd;return;}// Start gathering if we never started before, or if an ICE restart occurred.if (allocator_sessions_.empty() ||IceCredentialsChanged(allocator_sessions_.back()->ice_ufrag(),allocator_sessions_.back()->ice_pwd(),ice_parameters_.ufrag, ice_parameters_.pwd)) {if (gathering_state_ != kIceGatheringGathering) {gathering_state_ = kIceGatheringGathering;SignalGatheringState(this);}if (!allocator_sessions_.empty()) {IceRestartState state;if (writable()) {state = IceRestartState::CONNECTED;} else if (IsGettingPorts()) {state = IceRestartState::CONNECTING;} else {state = IceRestartState::DISCONNECTED;}RTC_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.IceRestartState",static_cast<int>(state),static_cast<int>(IceRestartState::MAX_VALUE));}for (const auto& session : allocator_sessions_) {if (session->IsStopped()) {continue;}session->StopGettingPorts();}// Time for a new allocator.std::unique_ptr<PortAllocatorSession> pooled_session =allocator_->TakePooledSession(transport_name(), component(),ice_parameters_.ufrag,ice_parameters_.pwd);if (pooled_session) {pooled_session->set_ice_tiebreaker(tiebreaker_);AddAllocatorSession(std::move(pooled_session));PortAllocatorSession* raw_pooled_session =allocator_sessions_.back().get(

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

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

相关文章

Unity 实现Canvas显示3D物体

新建一个UI相机&#xff0c;选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体&#xff0c;并将3D物体的层级设置为UI层 适当的放缩3DObjParent&#xff0c;让3D物体能显示出来…

“鞋履数据库”:运动鞋店产品信息管理系统

2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架是属于重量级…

[源码解析] 模型并行分布式训练Megatron (2) --- 整体架构

link [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 目录 [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 0x00 摘要0x01 启动 1.1 分布式启动1.2 构造基础 1.2.1 获取模型1.2.2 获取数据集1.2.3 步进函数 1.2.3.1 广播数据0x02 Pretrain0x03 初始化 3.1 …

【Go】Go数据类型详解—map

1. 前言 本篇博客将会介绍Go语言当中的另一大核心数据类型——map&#xff08;映射&#xff09;&#xff0c;当然在介绍这个数据类型之前我们还是要思考引入这个数据类型的原因&#xff1a; ❓ 需求&#xff1a;要求完成对一个班级所有同学的信息管理&#xff08;包括但不限于…

自动驾驶---Parking端到端架构

​​​​​​1 背景 自动泊车也是智能驾驶低速功能中比较重要的一部分&#xff0c;低速功能其中还包括记忆泊车&#xff0c;代客泊车等。传统的泊车算法通常使用基于规则或者搜索优化的方案来实现。然而&#xff0c;由于算法的复杂设计&#xff0c;这些方法在复杂的泊车场景中效…

USB接口实现CDC(usb转串口功能)

主控&#xff1a;stm32f429 PHY芯片&#xff1a;usb3320 Cubemx System Core-RCC connectivity-USB_OTG_HS Middleware and Software Packs-USB_DEVICE 时钟配置&#xff1a;根据自己使用的MCU工作频率设置 Generate Code Keil5 打开工程 usbd_cdc_if.c这个文件&…

软件测试框架有什么作用?好用的测试框架分享

在当今软件开发中&#xff0c;软件测试框架扮演着至关重要的角色。测试框架是指用于支持自动化测试及测试管理的环境或平台。它提供了一系列的规则、标准和工具&#xff0c;以确保软件产品的质量。框架涵盖了测试的所有层面&#xff0c;包括单元测试、集成测试和系统测试等。更…

2.1.2 select poll epoll reactor

1. select 的使用方法 fd_set rdset; FD_ZERO(&rdset); // 清空 rdset rdset fdset; // 将 fdset 拷贝到 rdset&#xff0c;准备传给 select select(maxFd 1, &rdset, NULL, NULL, NULL);参数说明&#xff1a; maxFd: 被监控的文件描述符中最大的一个。maxFd 1…

vscode安装fortran插件配置

本章教程,主要介绍如何在vscode上安装fortran插件,以便于使用vscode运行fortran编写的程序。 一、安装插件 首先在插件商店安装这个扩展插件 然后再把Code Runner扩展插件装上 二、下载mingw64 通过网盘分享的文件:mingw64 链接: https://pan.baidu.com/s/1fwS-CwC7dgI

企业该如何进行合格文件外发管理

随着信息技术的迅猛发展&#xff0c;企业间的文件交换变得越来越频繁。但是&#xff0c;如何确保文件传输的安全性与效率&#xff0c;成为企业管理者面临的一个重大挑战。镭速&#xff08;Raysync&#xff09;文件外发管理方案以其独特的优势&#xff0c;成为众多企业的首选。本…

(Python+selenium)UI自动化测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 我们在进行UI自动化测试时&#xff0c;一般采用javaselenium或者pythonselenium的方式。由于python比较简单&#xff0c;上手快&#xff0c;因此建议大家采用pyt…

使用openvino加速部署paddleocr文本检测模型(C++版)

使用openvino加速部署paddleocr文本检测模型(C++版) 引言1,前处理2,后处理3,C++部署代码引言 文本检测在openvino部署端的前后处理与在paddleocr中的不太一样。 1,前处理 在将文本检测的模型转换成onnx格式(输入输出大小都已固定),并部署到openvino后,其预处理后的输…

2021-04-08 VSC++: 降序折半查找。

void 降序折半查找(int* a, int aa, int aaa) {//缘由https://bbs.csdn.net/topics/399166569int aaaa aaa / 2; bool k 0;if (a[0] aa){cout << 0, cout << ends << "查找&#xff1a;" << aa << endl;k 1;return;}else if (a[aa…

MySQL三层B+树能存多少数据

结论 bigint类型的索引&#xff08;8字节&#xff09;&#xff0c;一条数据假设是1KB的话&#xff0c; 三层B树 能存2000万条数据 该题主要考察数据如何在B树中存储的 计算思路 1.计算叶节点的大小 2.计算子节点的个数&#xff0c;由此算出第三层叶子节点的个数&#xff08;n*n…

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads&#xff0c;根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dda0ea75096c42c0a79ef6f6f5521…

中伟视界:AI识别摄像头+AI预警平台在矿山皮带空载监测中的应用

在矿山开采和矿物处理过程中&#xff0c;皮带运输机扮演着举足轻重的角色。它们负责将矿石、煤炭等物料从一处运送到另一处&#xff0c;是矿山生产流程中不可或缺的一环。然而&#xff0c;皮带运输机在运行过程中也面临着一些挑战&#xff0c;其中之一便是皮带空载问题。皮带空…

实训项目-人力资源管理系统-1Company子模块

目录 前言&#xff1a; 用例图设计&#xff1a; 系统设计 开发方式&#xff1a; 技术架构 系统结构&#xff1a; API文档&#xff1a; 工程搭建&#xff1a; 搭建父项目 pom&#xff1a; 创建公共子模块&#xff1a; 返回实体&#xff1a; 分布式id生成器&#xff1a; …

2.5.3 文件使用、共享、保护、安全与可靠性

文章目录 文件使用文件共享文件保护系统安全与可靠性 文件使用 操作系统向用户提供操作级、编程级文件服务。 操作级服务包括目录管理&#xff0c;文件操作&#xff08;复制、删除、修改&#xff09;&#xff0c;文件管理&#xff08;设置文件权限&#xff09;。 编程级服务包括…

路由器转发数据报的封装过程

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器转发数据的封装过程 路由器转发数据的封…

vulnhub matrix-breakout靶机

1.搭建靶机 这样就是装好了 获取靶机IP nmap -O 192.168.47.129/24 2.信息收集 dirb http://192.168.47.128 dirb 首页 81端口一个登录页面 gobuster dir -u http://192.168.152.154 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html gra…