WebRTC API

WebRTC(Web 实时通信)是一种使 Web 应用程序和站点能够捕获和选择性地流式传输音频或视频媒体,以及在浏览器之间交换任意数据的而无需中间件的技术。WebRTC 的一系列标准使得在不需要用户安装插件或任何其他第三方软件的情况下,可以实现点对点数据共享和电话会议。

WebRTC 由几个相互关联的 API 和协议组成,它们共同工作以实现这一目标。你在这里找到的文档将帮助你了解 WebRTC 的基础知识,以及如何设置和使用数据和媒体连接等更多内容。

WebRTC 概念和用法

WebRTC 有多种用途;与媒体捕捉与媒体流 API 一起使用时,它们为 Web 提供了强大的多媒体功能,包括支持音频和视频会议、文件交换、屏幕共享、身份管理以及与传统电话系统的接口,包括发送 DTMF(按键拨号)信号。两个对等方之间的连接可以在不需要任何特殊驱动程序或插件的情况下建立,并且通常可以在没有任何中间服务器的情况下建立连接。

两个对等方之间的连接由 RTCPeerConnection 接口表示。一旦使用 RTCPeerConnection 建立并打开了连接,就可以向连接添加媒体流(MediaStream)或数据通道(RTCDataChannel)。

媒体流可以由任意数量的媒体信息轨道组成;轨道由基于 MediaStreamTrack 接口的对象表示,可以包含多种类型的媒体数据,包括音频、视频和文本(例如字幕甚至章节名称)。大多数流至少包含一个音频轨道和可能也包含一个视频轨道,并且可以用于发送和接收实时媒体或存储的媒体信息(例如流媒体电影)。

你还可以使用两个对等方之间的连接来交换任意二进制数据,使用 RTCDataChannel 接口。这可以用于反向信道信息、元数据交换、游戏状态数据包、文件传输,甚至作为数据传输的主要通道。

互操作性

WebRTC 在现代浏览器中通常得到很好的支持,但仍存在一些不兼容性。adapter.js 库是一个可以使应用程序免受这些不兼容性的影响的垫片。

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

管理在 RTCPeerConnection 上的 MediaStreamTrack 的数据编码和传输。

RTCRtpReceiver

管理在 RTCPeerConnection 上的 MediaStreamTrack 的数据接收和解码。

RTCTrackEvent

用于表示 track 事件的接口,该事件指示已将 RTCRtpReceiver 对象添加到 RTCPeerConnection 对象,表示已创建并添加了新的传入 MediaStreamTrackRTCPeerConnection

RTCSctpTransport

提供描述流控制传输协议(SCTP)传输的信息,并提供一种访问底层的用于所有 RTCPeerConnection 的数据通道发送和接收的 SCTP 包的数据报传输层安全(DTLS)传输的方式。

事件

bufferedamountlow

表示数据通道当前缓冲的数据量(由其 bufferedAmount 属性指示)已经减少到或低于通道的最小缓冲数据大小(由 bufferedAmountLowThreshold 指定)。

close

数据通道已完成关闭过程,现在处于 closed 状态。此时,其底层数据传输完全关闭。你可以通过观察 closing 事件来在关闭完成之前得到通知。

closing

RTCDataChannel 已转换为 closing 状态,表示它将很快关闭。你可以通过观察 close 事件来检测关闭过程的完成。

connectionstatechange

连接状态(可以通过 connectionState 访问)已更改。

datachannel

有一个新的 RTCDataChannel 在远程对等方打开新数据通道之后可用。此事件的类型是 RTCDataChannelEvent

error

表示数据通道上发生错误的 RTCErrorEvent

error

表示 RTCDtlsTransport 上发生错误的 RTCErrorEvent。此错误将是 dtls-failurefingerprint-failure

gatheringstatechange

RTCIceTransport 的收集状态已更改。

icecandidate

每当本地设备识别出一个新的 ICE 候选需要通过调用 setLocalDescription() 添加到本地对等方时,就会发送的 RTCPeerConnectionIceEvent

icecandidateerror

表示在收集 ICE 候选时发生错误的 RTCPeerConnectionIceErrorEvent

iceconnectionstatechange

在其 ICE 连接的状态(可通过 iceconnectionstate 属性访问)更改时,会发送给 RTCPeerConnection

icegatheringstatechange

在其 ICE 收集状态(可通过 icegatheringstate 属性访问)更改时,会发送给 RTCPeerConnection

message

在数据通道上收到消息。该事件的类型为 MessageEvent

negotiationneeded

通知 RTCPeerConnection 需要通过调用 createOffer(),然后是 setLocalDescription() 来执行会话协商。

open

RTCDataChannel 的底层数据传输已成功打开或重新打开。

selectedcandidatepairchange

RTCIceTransport 上的当前选择的 ICE 候选对已更改时触发的事件。

track

当成功协商了媒体流的流式传输后,将向 RTCPeerConnection 添加新轨道时,会发送类型为 RTCTrackeventtrack 事件。

signalingstatechange

在其 signalingstate 更改时,会发送到对等连接。这是由于调用 setLocalDescription()setRemoteDescription() 引起的。

statechange

RTCDtlsTransport 的状态已更改。

statechange

RTCIceTransport 的状态已更改。

statechange

RTCSctpTransport 的状态已更改。

rtctransform

编码的视频或音频帧已准备好在 worker 中使用转换流进行处理。

类型

RTCSctpTransport.state

指示 RTCSctpTransport 实例的状态。

身份和安全

这些 API 用于管理用户身份和安全性,以便为连接认证用户。

RTCIdentityProvider

使用户代理能够请求生成或验证身份断言。

RTCIdentityAssertion

表示当前连接的远程对等方的身份。如果尚未设置和验证对等方,则此接口返回 null。一旦设置,便无法更改。

RTCIdentityProviderRegistrar

注册身份提供商(IdP)。

RTCCertificate

表示 RTCPeerConnection 用于身份验证的证书。

电话

接口

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 中运行,或者已准备处理编码视频或音频帧时触发的事件。

指南

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 适配器来解决不同浏览器的 WebRTC 实现的兼容性问题。适配器是一个 JavaScript 垫片,使你的代码只需按照规范编写,便可以在所有支持 WebRTC 的浏览器中“正常工作”。

RTCDataChannel 简单示例

RTCDataChannel 接口是一个允许你在两个对等方之间打开一个通道(通过该通道你可以发送和接收任意数据)的特性。API 故意设计成与 WebSocket API 类似,以便可以使用相同的编程模型。

使用 Peer.js 构建联网电话

本教程将逐步指导你如何使用 Peer.js 构建电话。

规范

Specification
WebRTC: Real-Time Communication in Browsers
Media Capture and Streams
Media Capture from DOM Elements

WebRTC 相关协议

相关支持协议

参见