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 核心协议

另见