WebRTC 的 ICE candidate 協商

文章目錄

  • 前言
  • WebRTC 的 ICE candidate 協商
    • 1. 什么是 ICE candidate?
    • 2. ICE 協商的流程
    • 3.前端使用 ICE candidate 協商代碼示例
      • 1)收集 candidate 并發送
      • 2)WebSocket 接收 candidate 并添加
    • 4. ICE candidate 的類型
    • 5. ICE 協商常見問題
    • 6. 關鍵調試點
    • 7. 代碼片段加日志示例
    • 總結


前言

WebRTC 的 ICE candidate 協商

WebRTC 的 ICE candidate 協商


1. 什么是 ICE candidate?

  • ICE(Interactive Connectivity Establishment) 是 WebRTC 用于 NAT 穿透、建立點對點連接的核心協議。
  • candidate(候選地址)是指本地網絡環境下所有可能的可用地址(如本地IP、公網IP、中繼服務器IP等)。
  • 通過收集和交換 candidate,WebRTC 能找到一條可用的網絡路徑,實現端到端音視頻傳輸。

2. ICE 協商的流程

  1. 雙方創建 RTCPeerConnection,并設置 ICE 服務器(通常是 STUN/TURN)。
  2. 本地收集 candidate:瀏覽器會自動收集本地所有可用的網絡地址(candidate)。
  3. onicecandidate 事件觸發:每收集到一個 candidate,就通過信令服務器發送給對端。
  4. 對端收到 candidate,通過 addIceCandidate 添加到自己的 RTCPeerConnection。
  5. 雙方不斷交換 candidate,直到找到一條可用的網絡路徑,ICE 連接建立,媒體流就能傳輸了。

3.前端使用 ICE candidate 協商代碼示例

1)收集 candidate 并發送

 const pc = new RTCPeerConnection({iceServers: [// 免費的公共 STUN 服務,適用于測試和輕量級應用{ urls: "stun:stun.l.google.com:19302" },],})
pc.onicecandidate = (e) => {if (e.candidate) {ws.send(JSON.stringify({ type: "candidate", candidate: e.candidate }))}
}
  • 每當本地收集到一個 candidate,就通過 WebSocket 發送給對方。

    RTCPeerConnection ,截圖自MDN。

在這里插入圖片描述

2)WebSocket 接收 candidate 并添加

前端可以用 ws 這個庫。

 ws.onmessage = async (msg) => {if (data.type === "candidate") {try {await pc.addIceCandidate(data.candidate)} catch (e) {}}} 
  • 收到對方的 candidate 后,調用 addIceCandidate 添加到本地 RTCPeerConnection。

4. ICE candidate 的類型

  • host:本地局域網 IP 地址
  • srflx:服務器反射地址(通過 STUN 服務器獲取的公網 IP)
  • relay:中繼地址(通過 TURN 服務器獲取,適合復雜 NAT/防火墻環境)

5. ICE 協商常見問題

  • 沒有 candidate 交換:雙方無法建立連接,媒體流無法傳輸。
  • addIceCandidate 報錯:SDP 協商順序不對,或 candidate 格式有誤。
  • NAT/防火墻阻斷:需要配置 TURN 服務器。
  • 局域網可通,公網不通:STUN 只能穿透部分 NAT,復雜網絡需 TURN。

6. 關鍵調試點

  • onicecandidateaddIceCandidate 前后加日志,確認 candidate 是否收發完整。
  • 檢查 candidate 的類型和內容,確認是否有 srflxrelay 類型。
  • 瀏覽器控制臺查看 ICE 相關報錯(如 ICE failed、addIceCandidate failed 等)。

7. 代碼片段加日志示例

pc.onicecandidate = (e) => {if (e.candidate) {console.log('Send ICE candidate:', e.candidate);ws.send(JSON.stringify({ type: "candidate", candidate: e.candidate }))}
}else if (data.type === "candidate") {console.log('Receive ICE candidate:', data.candidate);try {await pc.addIceCandidate(data.candidate)} catch (e) {console.error('addIceCandidate error', e);}
}

總結

  • ICE candidate 協商是 WebRTC 能否連通的關鍵,決定了媒體流能否端到端傳輸。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87776.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

卡爾曼濾波介紹

卡爾曼濾波介紹📖 **卡爾曼濾波原理簡介**🔑 **核心思想**📦 **卡爾曼濾波的組成**🔍 **代碼分析(kalman_filter.py)**🏗? 1. 狀態空間定義🔄 2. 初始化模型矩陣🚀 3. 核…

遞歸與循環

文章目錄遞歸TestRecursiveListRemoveNodeTestRecursiveListRemoveNode2循環TestWhileLoopListRemoveNodeTestWhileLoopListRemoveNode2遞歸 關鍵理解這幾點: 1、求解基本問題 2、將原問題拆分為小問題,直至基本問題(難點) 3、借…

3D魔方游戲

# 3D魔方游戲 這是一個基于Three.js的3D魔方游戲,支持2到6階魔方的模擬操作。 ## 功能特點 - 支持2到6階魔方 - 真實的3D渲染效果 - 鼠標操作控制 - 隨機打亂功能 - 提示功能 - 重置功能 ### 安裝依賴 bash npm install ### 啟動游戲 bash npm start 然…

下載安裝 com0com

下載 在 sourceforge 網站下載安裝器:下載鏈接 安裝完成后可以在設備管理器中看到默認創建的一對虛擬串口 使用串口調試助手收發 使用串口調試助手分別打開。如下圖所示,在端口選擇的下拉列表中可以看到剛才在設備管理器中看到的 COM3 和 COM5 分…

C++ 應用軟件開發從入門到實戰詳解

目錄 1、引言 2、IDE 開發環境介紹 2.1、Visual Studio 2.2、Qt Creator 3、 C語言特性 3.1、熟悉泛型編程 3.2、了解C/C異常處理 3.3、熟練使用STL容器 3.4、熟悉C11新特性 4、Windows 平臺的編程技術與調試技能 4.1、需要掌握的若干編程技術和基礎知識 4.2、需…

Python爬蟲實戰:研究slug相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網技術的快速發展,網絡上的信息量呈爆炸式增長。如何從海量的非結構化數據中提取有價值的信息,成為當前數據科學領域的重要研究方向。網絡爬蟲作為一種自動化數據采集工具,可以高效地獲取網頁內容,為數據分析提供豐富的數據來源。 Sl…

人工智能-基礎篇-18-什么是RAG(檢索增強生成:知識庫+向量化技術+大語言模型LLM整合的技術框架)

RAG(Retrieval-Augmented Generation,檢索增強生成)是一種結合外部知識檢索與大語言模型(LLM)生成能力的技術框架,旨在提升生成式AI在問答、內容創作等任務中的準確性、實時性和領域適應性。 1、核心概念 …

CppCon 2018 學習:What do you mean “thread-safe“

什么是“線程安全”? “線程安全”指的是一個函數、方法或代碼塊能夠在多個線程同時執行時,不會出現意外的交互或破壞共享數據,能夠安全地運行。 POSIX 對線程安全的定義很清楚: “一個線程安全的函數可以在多個線程中被安全地并…

熱方程初邊值問題解法

已知公式: u ( x , t ) ∫ ? ∞ ∞ G ( x , y , t ) g ( y ) d y . u(x,t)\int_{-\infty}^{\infty}G(x,y,t)g(y)dy. u(x,t)∫?∞∞?G(x,y,t)g(y)dy. (1) 其中 G ( x , y , t ) 1 2 k π t e ? ( x ? y ) 2 4 k t G(x,y,t)\frac{1}{2…

怎樣理解:source ~/.bash_profile

場景復現 $ source ~/.bash_profileAnalysis 分析 一句話概括 source ~/.bash_profile “在 當前 終端會話里,立刻執行并加載 ~/.bash_profile 中的所有命令,讓其中定義的環境變量、函數、alias 等即時生效,而無需重新登錄或開新 Shell。…

搜索問答技術概述:基于知識圖譜與MRC的創新應用

目錄 一、問答系統應用分析 二、搜索問答技術與系統 (一)需求和信息分析 問答需求類型 多樣的數據源 文本組織形態 (二)主要問答技術介紹 發展和成熟度分析 重點問答技術基礎:KBQA和DeepQA KBQA(…

TCP數據的發送和接收

本篇文章結合實驗對 TCP 數據傳輸中的重傳機制、滑動窗口以及擁塞控制做簡要的分析學習。 重傳 實驗環境 這里使用兩臺騰訊云服務器:vm-1(172.19.0.3)和vm-2(172.19.0.6)。 超時重傳 首先 vm-1 作為服務端啟動 nc…

python 保存二維數組到本地

Python中保存二維數組有多種方法,以下是常用的幾種方式:1. 使用NumPy(推薦)import numpy as np# 創建二維數組 arr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 保存為.npy文件(NumPy專用格式) np.save…

LIN總線通訊中從節點波特率同步原理

波特率同步原理:從節點如何通過0x55校準時鐘? 一、同步場的核心作用:統一“時間標尺” 在LIN總線中,主節點與從節點各自擁有獨立的時鐘源(如MCU內部RC振蕩器),但由于制造工藝差異,…

【Unity筆記02】訂閱事件-自動開門

流程 當玩家移動到觸發區域的時候,門自動打開 事件系統 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class EventSystem : MonoBehaviour {public static EventSystem Instance { get; private set; }…

控制臺字符動畫

旋轉的立方體 #include <cstdint> #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <ctime> #include <thread> using namespace std;float angleX .0f; float a…

基于 PyTorch 的貓狗圖像分類實戰

基于 PyTorch 的貓狗圖像分類實戰 項目背景簡介 深度學習框架 PyTorch 因其動態計算圖和靈活易用性&#xff0c;被廣泛應用于圖像分類等計算機視覺任務。在入門計算機視覺領域時&#xff0c;常常以手寫數字識別&#xff08;MNIST&#xff09;作為 “Hello World”&#xff0c…

SwiftUI 7(iOS 26 / iPadOS 26)中玻璃化標簽頁的全新玩法

&#x1f378; Liquid Glass 登場&#xff1a;界面設計煥然一新 WWDC25 可謂驚喜連連&#xff0c;其中最引人矚目的變革之一&#xff0c;莫過于蘋果推出的全新跨平臺設計語言 —— Liquid Glass&#xff08;液態玻璃&#xff09;。這一設計風格涵蓋了從按鈕到導航欄&#xff0…

PDF處理控件Spire.PDF教程:在Java中讀取PDF,提取文本、圖片和表格

在數據驅動的現代開發中&#xff0c;高效處理 PDF 文檔已成為 Java 開發者不可或缺的核心能力。無論是處理各類發票掃描件、業務分析報告&#xff0c;還是包含豐富圖表的技術文檔&#xff0c;掌握 Java 版的 PDF 解析技術都將大幅提升數據處理效率&#xff0c;充分釋放文檔中的…

跨平臺游戲引擎 Axmol-2.7.0 發布

Axmol 2.7.0 版本是一個以錯誤修復和功能改進為主的次要LTS長期支持版本 &#x1f64f;感謝所有貢獻者及財務贊助者&#xff1a;scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox 重大變更 Android Studio 最低版本要求升級至 2025.1.1…