WebRTC API

WebRTC(Web 即時通訊)是一種技術,它使 Web 應用程式和網站能夠捕獲並可選擇性地流式傳輸音訊和/或影片媒體,以及在無需中介軟體的情況下在瀏覽器之間交換任意資料。構成 WebRTC 的標準集使得點對點資料共享和電話會議成為可能,而無需使用者安裝外掛或任何其他第三方軟體。

WebRTC 由幾個相互關聯的 API 和協議組成,它們協同工作以實現此目標。您在此處找到的文件將幫助您瞭解 WebRTC 的基本原理、如何設定和使用資料連線和媒體連線等。

WebRTC 概念和用法

WebRTC 服務於多種目的;它與 Media Capture and Streams API 一起,為 Web 提供了強大的多媒體功能,包括支援音訊和視訊會議、檔案交換、螢幕共享、身份管理以及與傳統電話系統(包括支援傳送 DTMF(觸控撥號)訊號)的介面。對等方之間的連線可以在無需任何特殊驅動程式或外掛的情況下建立,並且通常可以在無需任何中間伺服器的情況下建立。

兩個對等方之間的連線由 RTCPeerConnection 介面表示。一旦使用 RTCPeerConnection 建立並開啟連線,媒體流 (MediaStream) 和/或資料通道 (RTCDataChannel) 就可以新增到連線中。

媒體流可以包含任意數量的媒體資訊軌道;軌道由基於 MediaStreamTrack 介面的物件表示,可以包含多種型別的媒體資料之一,包括音訊、影片和文字(例如字幕甚至章節名稱)。大多數流至少包含一個音訊軌道,並且可能還包含一個影片軌道,可用於傳送和接收即時媒體或儲存的媒體資訊(例如流式傳輸的電影)。

您還可以使用兩個對等方之間的連線,透過 RTCDataChannel 介面交換任意二進位制資料。這可用於後向通道資訊、元資料交換、遊戲狀態包、檔案傳輸,甚至作為資料傳輸的主通道。

互操作性

WebRTC 在現代瀏覽器中普遍支援良好,但仍然存在一些不相容性。adapter.js 庫是一個 shim,用於隔離應用程式免受這些不相容性的影響。

WebRTC 參考

由於 WebRTC 提供了協同工作以完成各種任務的介面,因此我們將參考按類別進行了劃分。請參閱側邊欄以獲取按字母順序排列的列表。

連線設定和管理

這些介面、字典和型別用於設定、開啟和管理 WebRTC 連線。其中包括表示對等媒體連線、資料通道的介面,以及在交換每個對等方的能力資訊時使用的介面,以便為雙向媒體連線選擇最佳配置。

介面

RTCPeerConnection

表示本地計算機和遠端對等方之間的 WebRTC 連線。它用於處理兩個對等方之間的高效資料流。

RTCDataChannel

表示連線的兩個對等方之間的雙向資料通道。

RTCDataChannelEvent

表示在將 RTCDataChannel 附加到 RTCPeerConnection 時發生的事件。使用此介面傳送的唯一事件是 datachannel

RTCSessionDescription

表示會話的引數。每個 RTCSessionDescription 由一個描述 type(指示其描述的提議/應答協商過程的哪個部分)和會話的 SDP 描述符組成。

RTCStatsReport

提供詳細說明連線或連線上單個軌道的統計資訊;可以透過呼叫 RTCPeerConnection.getStats() 獲取報告。

RTCIceCandidate

表示用於建立 RTCPeerConnection 的候選互動式連線建立 (ICE) 伺服器。

RTCIceTransport

表示有關 ICE 傳輸的資訊。

RTCPeerConnectionIceEvent

表示與 ICE 候選者(通常是 RTCPeerConnection)相關的事件。只有一種事件型別:icecandidate

RTCRtpSender

管理 RTCPeerConnectionMediaStreamTrack 的資料編碼和傳輸。

RTCRtpReceiver

管理 RTCPeerConnectionMediaStreamTrack 的資料接收和解碼。

RTCTrackEvent

用於表示 track 事件的介面,該事件指示已將 RTCRtpReceiver 物件新增到 RTCPeerConnection 物件,表明已建立新的傳入 MediaStreamTrack 並將其新增到 RTCPeerConnection 中。

RTCSctpTransport

提供描述流控制傳輸協議 (SCTP) 傳輸的資訊,並提供一種訪問底層資料報傳輸層安全 (DTLS) 傳輸的方式,透過該傳輸,RTCPeerConnection 的所有資料通道的 SCTP 資料包都被髮送和接收。

事件

bufferedamountlow

資料通道當前緩衝的資料量(由其 bufferedAmount 屬性指示)已減少到小於或等於通道的最小緩衝資料大小,如 bufferedAmountLowThreshold 所指定。

close

資料通道已完成關閉過程,現在處於 closed 狀態。此時其底層資料傳輸已完全關閉。您可以監視 closing 事件,以便在關閉完成之前收到通知。

closing

RTCDataChannel 已轉換為 closing 狀態,表明它將很快關閉。您可以透過監視 close 事件來檢測關閉過程的完成。

connectionstatechange

連線的狀態(可在 connectionState 中訪問)已更改。

datachannel

在遠端對等方開啟新的資料通道後,新的 RTCDataChannel 可用。此事件的型別是 RTCDataChannelEvent

error

一個 RTCErrorEvent,指示資料通道上發生了錯誤。

error

一個 RTCErrorEvent,指示 RTCDtlsTransport 上發生了錯誤。此錯誤將是 dtls-failurefingerprint-failure

gatheringstatechange

RTCIceTransport 的收集狀態已更改。

icecandidate

一個 RTCPeerConnectionIceEvent,每當本地裝置識別出需要透過呼叫 setLocalDescription() 新增到本地對等方的新 ICE 候選者時傳送。

icecandidateerror

一個 RTCPeerConnectionIceErrorEvent,指示在收集 ICE 候選者時發生了錯誤。

iceconnectionstatechange

RTCPeerConnection 的 ICE 連線狀態(在 iceConnectionState 屬性中找到)更改時傳送給它。

icegatheringstatechange

RTCPeerConnection 的 ICE 收集狀態(在 iceGatheringState 屬性中找到)更改時傳送給它。

message

資料通道上已收到一條訊息。事件型別為 MessageEvent

negotiationneeded

通知 RTCPeerConnection 需要透過呼叫 createOffer()setLocalDescription() 來執行會話協商。

open

RTCDataChannel 的底層資料傳輸已成功開啟或重新開啟。

selectedcandidatepairchange

觸發事件的 RTCIceTransport 上當前選定的 ICE 候選對已更改。

track

型別為 RTCTrackEventtrack 事件在成功協商媒體流後,當新的軌道新增到連線時傳送給 RTCPeerConnection

signalingstatechange

當對等連線的 signalingState 發生變化時傳送給它。這發生在呼叫 setLocalDescription()setRemoteDescription() 之後。

statechange

RTCDtlsTransport 的狀態已更改。

statechange

RTCIceTransport 的狀態已更改。

statechange

RTCSctpTransport 的狀態已更改。

rtctransform

一個編碼的影片或音訊幀已準備好使用 worker 中的轉換流進行處理。

型別

RTCSctpTransport.state

指示 RTCSctpTransport 例項的狀態。

身份和安全

這些 API 用於管理使用者身份和安全,以便對連線的使用者進行身份驗證。

RTCIdentityProvider

使使用者代理能夠請求生成或驗證身份斷言。

RTCIdentityAssertion

表示當前連線的遠端對等方的身份。如果尚未設定並驗證對等方,則此介面返回 null。一旦設定,就不能更改。

RTCIdentityProviderRegistrar

註冊身份提供者 (idP)。

RTCCertificate

表示 RTCPeerConnection 用於身份驗證的證書。

電話

這些介面和事件與公共交換電話網路 (PSTN) 的互動有關。它們主要用於在網路上向遠端對等方傳送音訊撥號音或表示這些音的包。

介面

RTCDTMFSender

管理 RTCPeerConnection 的雙音多頻 (DTMF) 信令的編碼和傳輸。

RTCDTMFToneChangeEvent

tonechange 事件使用,指示 DTMF 音調已開始或結束。此事件不冒泡(除非另有說明),也不可取消(除非另有說明)。

事件

tonechange

新的 DTMF 音調已開始透過連線播放,或者 RTCDTMFSendertoneBuffer 中的最後一個音調已傳送,並且緩衝區現在為空。事件型別為 RTCDTMFToneChangeEvent

編碼轉換

這些介面和事件用於使用在 worker 中執行的轉換流處理傳入和傳出編碼的影片和音訊幀。

介面

RTCRtpScriptTransform

一個用於在 worker 中執行的轉換流插入到 RTC 管道中的介面。

RTCRtpScriptTransformer

RTCRtpScriptTransform 的 worker 端對應物,它從主執行緒傳遞選項,以及一個可讀流和可寫流,可用於透過 TransformStream 管道傳輸編碼幀。

RTCEncodedVideoFrame

表示要在 RTC 管道中轉換的編碼影片幀。

RTCEncodedAudioFrame

表示要在 RTC 管道中轉換的編碼音訊幀。

屬性

RTCRtpReceiver.transform

一個用於將轉換流插入接收器管道的屬性,用於傳入的編碼影片和音訊幀。

RTCRtpSender.transform

一個用於將轉換流插入傳送器管道的屬性,用於傳出的編碼影片和音訊幀。

事件

rtctransform

RTC 轉換已準備好在 worker 中執行,或者編碼的影片或音訊幀已準備好處理。

指南

即時傳輸協議 (RTP) 簡介

即時傳輸協議 (RTP),定義於 RFC 3550,是 IETF 標準協議,可為需要即時優先順序的資料交換啟用即時連線。本文概述了 RTP 是什麼以及它如何在 WebRTC 的上下文中發揮作用。

WebRTC 協議簡介

本文介紹了 WebRTC API 構建在其上的協議。

WebRTC 連線

關於 WebRTC 連線如何工作以及各種協議和介面如何協同使用以構建強大通訊應用程式的指南。

WebRTC 會話的生命週期

WebRTC 允許您在瀏覽器應用程式中構建任意資料、音訊或影片(或其任意組合)的點對點通訊。在本文中,我們將研究 WebRTC 會話的生命週期,從建立連線一直到不再需要時關閉連線。

建立連線:完美的協商模式

完美協商是一種設計模式,建議您的信令過程遵循此模式,它在協商中提供了透明性,同時允許雙方都可以作為提議者或應答者,而無需大量程式碼來區分兩者。

信令與雙向視訊通話

一個教程和示例,它將為前一個示例建立的基於 WebSocket 的聊天系統轉換為支援參與者之間開啟視訊通話。聊天伺服器的 WebSocket 連線用於 WebRTC 信令。

WebRTC 使用的編解碼器

WebRTC 要求瀏覽器支援的編解碼器以及各種流行瀏覽器支援的可選編解碼器的指南。其中包含一個幫助您選擇最適合您需求的編解碼器的指南。

使用 WebRTC 資料通道

本指南介紹瞭如何使用對等連線和關聯的 RTCDataChannel 在兩個對等方之間交換任意資料。

WebRTC 中的 DTMF 使用

WebRTC 對與連結到老式電話系統的閘道器互動的支援包括使用 RTCDTMFSender 介面傳送 DTMF 音調的支援。本指南演示瞭如何實現這一點。

使用 WebRTC 編碼轉換

本指南演示了 Web 應用程式如何使用在 worker 中執行的 TransformStream 來修改傳入和傳出的 WebRTC 編碼影片和音訊幀。

教程

使用 WebRTC adapter.js 提高相容性

WebRTC 組織在 GitHub 上提供了 WebRTC adapter,以解決不同瀏覽器 WebRTC 實現中的相容性問題。adapter 是一個 JavaScript shim,它允許您的程式碼按照規範編寫,以便在所有支援 WebRTC 的瀏覽器中“正常工作”。

一個簡單的 RTCDataChannel 示例

RTCDataChannel 介面是一個功能,它允許您在兩個對等方之間開啟一個通道,您可以透過該通道傳送和接收任意資料。API 與 WebSocket API 故意相似,以便可以使用相同的程式設計模型。

使用 Peer.js 構建網際網路連線電話

本教程是關於如何使用 Peer.js 構建電話的分步指南。

規範

規範
WebRTC:瀏覽器中的即時通訊
媒體捕獲和流
從 DOM 元素捕獲媒體

WebRTC 核心協議

另見