如果您曾經在瀏覽器中加入視訊通話而無需安裝任何東西,那就是使用了 WebRTC。如果您想知道 它是如何實際運作的 -- 地球另一側的兩個瀏覽器如何以亞秒級延遲、無需外掛程式、無需 Flash、無需 Java 小程式就能將視訊串流到彼此 -- 這就是為您準備的指南。

WebRTC(Web 即時通訊)是一個開源框架,使瀏覽器和行動應用程式能夠以實時的點對點方式交換音訊、視訊和任意數據。Google 在 2011 年發布了初始代碼,W3C 在 2021 年將其標準化,到 2026 年它已支撐從 Zoom 式會議到 AI 語音代理再到遠距醫療平台的所有技術。全球 WebRTC 市場預計今年將達到 108.9 億美元,CAGR 在 2034 年前後保持在 37% 左右。

多年來我已將基於 WebRTC 的功能整合到多個生產應用程式中,我可以告訴您:該協議優雅,API 令人驚訝地易於使用,但邊界情況會謙卑您。讓我們深入探討所有這些內容。

目錄

What Is WebRTC? A Developer's Complete Guide for 2026

WebRTC 實際上是什麼

WebRTC 的核心是一組 JavaScript API 和底層網路協議,允許兩個端點(通常是瀏覽器)建立直接連接並交換媒體或數據。在理想情況下,沒有伺服器位於媒體路徑中。無需外掛程式。無需下載。

"實時"部分很重要。我們說的是以毫秒計的延遲,而不是秒。傳統的基於 HTTP 的串流(HLS、DASH)通常會引入 3-30 秒的延遲。WebRTC 將其降低到 500 毫秒以下,通常低於 200 毫秒。這是對話和對講機通話之間的區別。

WebRTC 在 2026 年得到所有主要瀏覽器的支持:

瀏覽器 WebRTC 支持 說明
Chrome 完整支持 參考實現
Firefox 完整支持 DataChannel 支持強大
Safari 完整支持 自 2020 年以來進步顯著
Edge 完整支持 基於 Chromium,鏡像 Chrome
Brave 完整支持 基於 Chromium
行動版 Chrome/Safari 完整支持 iOS 在歷史上有怪癖,大部分已解決

它也可在瀏覽器外使用。原生庫適用於 iOS、Android、C++、Rust 和 Python。如果您正在構建 VoIP 應用程式、無人機控制系統或 IoT 數據管道,WebRTC 也可以在那裡運作。

WebRTC 如何在幕後運作

以下是當我第一次接觸 WebRTC 時真正幫助我理解它的心智模型。

想像兩個人試圖通話,但彼此都不知道對方的電話號碼,兩人都在鎖著的門後面(NAT 和防火牆)。他們需要一個共同的朋友(信令伺服器)來交換號碼。一旦他們有了彼此的信息,他們就直接通話 -- 共同的朋友不再參與。

技術流程如下:

1. 媒體擷取

瀏覽器通過 getUserMedia() 請求存取用戶的攝像頭和麥克風的權限。這會返回一個 MediaStream 物件。

2. 信令(帶外)

在兩個對等端點連接之前,他們需要交換連接中繼資料:他們支持哪些編解碼器、他們的網路位址、安全指紋。這種交換稱為 信令,WebRTC 故意未指定它如何發生。您可以使用 WebSocket、HTTP 輪詢、信鴿 -- 任何有效的方式。

信令交換涉及兩種類型的消息:

  • SDP(會話描述協議):描述對等端點想要發送/接收的媒體及其方式
  • ICE 候選項:可以到達對等端點的網路位址

3. 連接建立(ICE)

ICE(交互式連通性建立)框架嘗試多個路徑來連接對等端點。它先嘗試直接連接,然後使用 STUN 伺服器發現公共 IP,如果點對點失敗,則回退到 TURN 中繼伺服器。

4. 安全媒體流

一旦連接,媒體直接在對等端點之間流動,使用 DTLS 和 SRTP 加密。規範禁止任何未加密的 WebRTC 連接 -- 這是強制性的。

三個核心 API

WebRTC 向 JavaScript 公開三個主要 API。理解這些是戰鬥的 80%。

getUserMedia()

從用戶的設備擷取音訊和視訊。

// 基本攝像頭 + 麥克風存取
const stream = await navigator.mediaDevices.getUserMedia({
  video: {
    width: { ideal: 1280 },
    height: { ideal: 720 },
    frameRate: { ideal: 30 }
  },
  audio: {
    echoCancellation: true,
    noiseSuppression: true
  }
});

// 附加到視訊元素
document.getElementById('localVideo').srcObject = stream;

您也可以使用 getDisplayMedia() 取得螢幕共享:

const screenStream = await navigator.mediaDevices.getDisplayMedia({
  video: { cursor: 'always' },
  audio: true // 系統音訊,瀏覽器支持各不相同
});

RTCPeerConnection

這是主力。它管理對等連接的整個生命週期:編解碼器協商、ICE 候選項收集、DTLS 握手、頻寬估計、丟包恢復。

const config = {
  iceServers: [
    { urls: 'stun:stun.l.google.com:19302' },
    {
      urls: 'turn:turn.yourserver.com:3478',
      username: 'user',
      credential: 'pass'
    }
  ]
};

const pc = new RTCPeerConnection(config);

// 新增本地軌道
stream.getTracks().forEach(track => pc.addTrack(track, stream));

// 處理來自遠端對等端點的傳入軌道
pc.ontrack = (event) => {
  document.getElementById('remoteVideo').srcObject = event.streams[0];
};

// 建立提案(呼叫方)
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
// 通過您的信令伺服器將提案發送到遠端對等端點

// 在另一側,接收提案並建立回答
await pc.setRemoteDescription(receivedOffer);
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
// 通過信令發送回答

RTCDataChannel

這個不會得到足夠的關注。DataChannel 讓您在對等端點之間發送任意數據 -- 文本、二進制、文件、遊戲狀態,任何東西。它建立在 SCTP 之上,因此您可以選擇有序/無序傳遞和可靠/不可靠的傳輸。

const dataChannel = pc.createDataChannel('chat', {
  ordered: true // 保證消息順序
});

dataChannel.onopen = () => {
  dataChannel.send('Hello from peer A!');
};

dataChannel.onmessage = (event) => {
  console.log('Received:', event.data);
};

// 在遠端對等端點上
pc.ondatachannel = (event) => {
  const channel = event.channel;
  channel.onmessage = (e) => console.log('Got:', e.data);
};

我使用過 DataChannel 進行實時協作編輯、多人遊戲狀態同步,甚至大型文件傳輸。延遲比 WebSocket 低得多,因為數據不通過伺服器路由。

What Is WebRTC? A Developer's Complete Guide for 2026 - architecture

信令:WebRTC 不處理的部分

這會在第一次時難倒每個開發人員。WebRTC 是 媒體傳輸 的協議,而不是 發現 的協議。兩個對等端點無法在沒有幫助的情況下找到彼此。

您需要構建(或使用)一個信令伺服器,該伺服器:

  1. 讓對等端點註冊其存在
  2. 在對等端點之間轉發 SDP 提案和回答
  3. 中繼 ICE 候選項

大多數團隊使用 WebSocket 進行信令。以下是一個最小的 Node.js 示例:

// 伺服器(使用 ws 庫)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

const rooms = new Map();

wss.on('connection', (ws) => {
  ws.on('message', (data) => {
    const msg = JSON.parse(data);
    
    if (msg.type === 'join') {
      rooms.set(msg.roomId, [...(rooms.get(msg.roomId) || []), ws]);
    }
    
    if (['offer', 'answer', 'ice-candidate'].includes(msg.type)) {
      // 轉發到房間中的其他對等端點
      const peers = rooms.get(msg.roomId) || [];
      peers.forEach(peer => {
        if (peer !== ws && peer.readyState === WebSocket.OPEN) {
          peer.send(JSON.stringify(msg));
        }
      });
    }
  });
});

信令伺服器是您 必須 運行的唯一伺服器。一旦連接建立,它可以關閉(儘管您希望它在重新連接場景中保持運行)。

NAT 穿越:STUN、TURN 和 ICE

這是 WebRTC 變得棘手的地方。大多數設備位於 NAT(網路位址轉譯)後面,這意味著他們的本地 IP 位址無法從網際網路到達。WebRTC 使用三層方法來解決這個問題:

STUN(NAT 會話穿越實用程式):一個輕量級伺服器,告訴您的瀏覽器"以下是您的公共 IP 和連接埠。"Google 運行免費的 STUN 伺服器(stun:stun.l.google.com:19302)。STUN 快速、便宜,大約 80-85% 的時間都有效。

TURN(使用 NAT 周圍中繼的穿越):當直接點對點連接失敗(對稱 NAT、嚴格防火牆)時,TURN 充當媒體中繼。所有流量通過 TURN 伺服器流動。這有 100% 的成功率,但會消耗頻寬並增加延遲。對於生產應用程式,運行自己的 TURN 伺服器是強制性的。Coturn 是標準的開源選項。

ICE(交互式連通性建立):協調 STUN 和 TURN 的框架。ICE 收集候選位址(本地、通過 STUN 的伺服器反射、通過 TURN 的中繼)並系統地測試它們以找到最佳工作路徑。

根據我的經驗,生產環境中大約 15-20% 的連接最終會通過 TURN。公司防火牆是最大的罪魁禍首。為 TURN 伺服器成本預算 -- 它們不是可選的。

WebRTC 中的安全性

WebRTC 在設計上是安全的,這令人欣慰。以下是內置的內容:

  • DTLS(數據格傳輸層安全):加密所有數據通道。想像 TLS,但用於 UDP。
  • SRTP(安全即時傳輸協議):加密所有媒體串流。
  • 強制加密:您從字面上無法建立未加密的 WebRTC 連接。規範禁止它。
  • 權限提示:瀏覽器在存取攝像頭或麥克風之前需要明確的用戶同意。
  • 來源隔離:網頁只能從安全來源 (HTTPS) 存取 WebRTC API。

沒有"禁用加密"旗標。沒有不安全的後備方案。這是一個經過深思熟慮的設計選擇,這是一個很好的選擇。

話雖如此,您的信令伺服器是一個潛在的漏洞。如果有人破壞信令,他們可能會將連接重定向到惡意對等端點。使用經過身份驗證的 WebSocket 連接並驗證伺服器端的所有內容。

WebRTC 在 2026 年的使用案例

顯而易見的使用案例是視訊通話,但 WebRTC 已遠超過此範圍。

視訊會議

Zoom、Google Meet、Microsoft Teams 和數十個較小的參與者都使用 WebRTC(或其底層協議的修改版本)。對於多方通話,大多數平台使用 SFU(選擇性轉發單元)架構,而不是純點對點 -- 更多內容如下。

AI 語音代理

這是 2026 年增長最快的使用案例。Vapi、Retell 和 Bland.ai 等公司使用 WebRTC 在用戶和 AI 模型之間實時傳輸音訊。亞 200 毫秒的延遲至關重要 -- 任何更多的延遲都會使對話感覺不自然。

遠距醫療

遠距醫生訪問在 COVID 期間爆炸性增長,從未消退。WebRTC 提供 HIPAA 兼容的加密視訊,無需軟體安裝。

直播購物和廣播

用於直播電子商務的超低延遲串流。觀眾實時看到產品演示並可以立即互動。傳統串流協議會增加過多延遲。

客戶支持

螢幕共享和視訊通話直接嵌入在支持小部件中。客戶不下載任何東西。代理實時看到問題。

IoT 和無人機

DataChannel 擅長向邊緣設備發送控制命令並接收遙測數據。WebRTC 內置的 NAT 穿越解決了許多 IoT 開發人員必須手動處理的無數問題。

2026 年的新功能

WebRTC 並未停滯不前。一些重大發展正在塑造我們現在使用它的方式。

AI 整合無處不在

實時轉錄、即時翻譯、由機器學習模型驅動的背景噪音抑制、通話期間的情緒分析 -- 所有這些都依賴於 WebRTC 的低延遲傳輸。WebRTC 基礎設施與大型語言模型的融合可能是今年實時通訊的最大單一趨勢。

WebTransport 和 WebCodec

WebTransport(建立在 HTTP/3 和 QUIC 之上)為某些串流場景提供了替代的傳輸層。它並未取代 WebRTC -- 它不處理點對點或 NAT 穿越 -- 但它是伺服器到客戶端串流的強有力補充,在這種情況下您希望更好地控制編碼。

WebCodec 為開發人員提供對硬體視訊編碼器和解碼器的直接存取,繞過瀏覽器的媒體管道。結合 WebRTC 的 Insertable Streams API,這啟用了具有更好性能的自訂視訊處理(端對端加密、AR 濾鏡)。

可擴展視訊編碼 (SVC)

SVC 支持已顯著成熟。VP9 SVC 和 AV1 SVC 等編碼器允許單個編碼串流為多個品質級別服務,這對基於 SFU 的架構來說是巨大的。您無需編碼三個單獨的品質串流(simulcast),而是編碼一次,SFU 根據每個接收者的頻寬剝離層。

WHIP 和 WHEP

WebRTC-HTTP 攝取協議 (WHIP) 和 WebRTC-HTTP 出口協議 (WHEP) 標準化了 WebRTC 如何連接到媒體伺服器。在這些協議之前,每個媒體伺服器都有自己的專有信令。WHIP/WHEP 為生態系統帶來了理智。

WebRTC 與替代方案

WebRTC 與其他實時通訊技術相比的位置如何?

技術 延遲 方向 NAT 穿越 瀏覽器支持 最適合
WebRTC < 500 毫秒 P2P 或通過 SFU 內置 (ICE) 所有主要瀏覽器 視訊通話、實時互動
HLS 3-30 秒 伺服器 → 客戶端 N/A 通用 VOD、向大量觀眾直播
DASH 3-30 秒 伺服器 → 客戶端 N/A 大多數瀏覽器 自適應位元率 VOD
WebSocket ~50 毫秒(僅數據) 客戶端 ↔ 伺服器 所有主要瀏覽器 聊天、通知、實時數據
WebTransport ~50 毫秒 客戶端 ↔ 伺服器 Chrome、Firefox、Edge 低延遲伺服器串流
RTMP 1-5 秒 客戶端 → 伺服器 需要播放器 攝取到串流平台
SRT 0.5-2 秒 點對點 有限 需要應用程式 廣播貢獻

關鍵區別:WebRTC 是唯一的瀏覽器原生選項,可進行點對點通訊,具有內置 NAT 穿越和強制加密。如果您需要在瀏覽器中進行實時雙向通訊,它仍然是答案。

使用 WebRTC 構建:庫和平台

可以 使用原始瀏覽器 API 從頭開始構建所有內容。我做過。我不推薦用於生產,除非您擁有深入的專業知識和特定的原因。

2026 年重要的工具如下:

媒體伺服器 (SFU)

  • LiveKit:開源,用 Go 構建,開發人員體驗極佳。我目前對大多數項目的推薦。支持 SFU 架構、simulcast、數據通道,並為每個主要平台提供 SDK。
  • Janus:成熟的基於 C 的媒體伺服器。非常靈活,但更低級。您將編寫更多代碼。
  • mediasoup:基於 Node.js 的 SFU。如果您的團隊位於 JavaScript 生態系統中很不錯。
  • Pion:Go 中的 WebRTC 實現。不是完整的媒體伺服器,但對於構建自訂 WebRTC 基礎設施來說非常有用。

CPaaS 平台

  • Twilio:800 磅的大猩猩。廣泛的 API、很好的文檔、高級定價。
  • Agora:在亞太地區強勁,良好的 SDK 品質。
  • Daily.co:開發人員友好,乾淨的 API,合理的定價。
  • Vonage(前身為 Tokbox):穩定,存在已久。

何時構建與購買

如果您正在構建視訊是一個 功能 的產品(例如向支持儀表板添加視訊聊天),請使用 CPaaS 或 LiveKit。如果視訊 產品,您可能需要更多控制權,應考慮運行自己的 SFU 基礎設施。

對於使用 Next.js 或 Astro 等框架構建的網路應用程式,通過 LiveKit 的 React SDK 之類的庫整合 WebRTC 是直截了當的。我們已將實時視訊功能整合到無頭 CMS 驅動的網站中 -- 解耦的架構實際上使其更容易,因為您的前端框架處理 UI,而 WebRTC 獨立處理媒體傳輸。

常見陷阱和寶貴教訓

構建多個 WebRTC 應用程式後,以下是我希望有人早些告訴我的內容:

始終部署 TURN 伺服器。 我見過開發人員跳過 TURN,因為"它在測試中運作良好"。它運作良好是因為您的測試設備在同一網路上。在生產環境中,15-20% 的用戶將位於限制性 NAT 或防火牆後面。沒有 TURN,這些用戶根本無法連接。

優雅地處理斷開連接。 網路條件不斷變化。您的應用程式需要檢測連接丟失、嘗試重新連接並通知用戶 -- 所有這些都不會丟失應用程式狀態。iceconnectionstatechange 事件是您的朋友。

頻寬估計很難。 WebRTC 具有內置的頻寬估計,但它不是魔術。在擁塞的網路上,視訊品質會下降。使用 getStats() 監控連接品質並相應地調整您的 UI -- 也許顯示"連接不良"指示器或切換到僅音訊。

Safari 有怪癖。 它已經好得多,但 Safari 仍然以不同的方式處理一些邊界情況。盡早且經常在實際 iOS 設備上測試。Simulcast 行為特別可能讓您感到驚訝。

超過點對點的擴展需要 SFU。 1 對 1 通話很簡單的 P2P。4 人通話使用網狀(每個人連接到每個人)意味著每個參與者維持 3 個連接,編碼和上傳 3 個視訊串流。它不會擴展。對於超過 3 個參與者的任何情況,請使用 SFU,其中每個參與者向伺服器發送一個串流,伺服器轉發給所有人。

如果您正在構建實時應用程式並需要幫助將 WebRTC 層與您的無頭 CMS 設置一起構建,請與我們聯繫 -- 我們已經做過足夠多次,知道地雷在哪裡。

常見問題

WebRTC 代表什麼? WebRTC 代表 Web 即時通訊。它是一個開源項目和 W3C 標準,透過簡單的 JavaScript API 為瀏覽器和行動應用程式提供實時音訊、視訊和數據通訊功能。

使用 WebRTC 是免費的嗎? WebRTC API 和協議完全免費且開源。但是,構建生產應用程式涉及信令伺服器、TURN 中繼伺服器(消耗頻寬)和可能的媒體伺服器(SFU)的成本。STUN 伺服器通常是免費的 -- Google 提供公共伺服器。

WebRTC 可以無伺服器工作嗎? 並非完全可以。雖然媒體流量是點對點的(媒體路徑中沒有伺服器),但您仍然需要一個信令伺服器來幫助對等端點相互發現並交換連接信息。您還需要 STUN/TURN 伺服器進行 NAT 穿越。關鍵點是伺服器看不到或處理媒體數據。

WebRTC 與 WebSocket 有何不同? WebSocket 在客戶端和伺服器之間提供持久的雙向連接 -- 適合聊天、通知和實時數據。WebRTC 在客戶端之間提供點對點連接,針對媒體(音訊/視訊)進行優化。WebRTC 使用 UDP 以獲得更低的延遲,而 WebSocket 使用 TCP。實際上,許多應用程式使用 WebSocket 進行信令,使用 WebRTC 進行媒體傳輸。

WebRTC 可用於向數千名觀眾直播嗎? 純點對點 WebRTC 無法擴展到數千名觀眾。但是,結合 SFU 或媒體伺服器,WebRTC 可以處理大規模廣播。平台使用這樣的架構,其中廣播方向伺服器發送一個串流,然後伺服器通過 WebRTC 將其分發給數千名觀眾。對於超過 10,000 名觀眾的觀眾,基於 CDN 的 HLS/DASH 方法通常更具成本效益。

WebRTC 是安全的嗎?通話可以被截取嗎? WebRTC 在設計上是安全的。所有媒體和數據都使用 DTLS 和 SRTP 加密 -- 加密是強制性的,無法禁用。在點對點場景中,加密是端對端的。使用 SFU 時,伺服器會解密和重新加密媒體,因此您信任伺服器操作者。要透過 SFU 實現真正的端對端加密,請查看 Insertable Streams(在 WebRTC 中也稱為"E2EE")。

STUN 和 TURN 伺服器之間的區別是什麼? STUN 伺服器是輕量級的 -- 他們簡單地告訴您的瀏覽器其面向公眾的 IP 位址和連接埠,這有助於建立直接點對點連接。TURN 伺服器更重 -- 它們充當中繼,當直接連接失敗時轉發所有媒體流量。STUN 很便宜(幾乎免費),TURN 很昂貴(您為頻寬付費)。大約 80-85% 的連接單獨使用 STUN 就成功了;TURN 處理其餘的。

WebTransport 會取代 WebRTC 嗎? 否。WebTransport 和 WebRTC 解決不同的問題。WebTransport(建立在 HTTP/3 和 QUIC 之上)非常適合客戶端到伺服器的通訊,低延遲,但它不進行點對點連接或 NAT 穿越。WebRTC 仍然是唯一的瀏覽器原生解決方案,用於直接點對點媒體通訊。它們是互補技術,在 2026 年許多應用程式同時使用兩者。