RTCPeerConnection
是 WebRTC API 中的中心接口。它表示本地和远程对等设备之间的连接,并提供建立连接所需的所有函数和事件。
建立对等连接
实现 WebRTC 功能的应用通常在很大程度上依赖于 RTCPeerConnection
接口。从调用方端(即发起连接的对等方)开始建立连接的过程通常如下:
- 使用适当的 ICE 配置创建一个新的
RTCPeerConnection
实例。 - 使用
RTCPeerConnection.createOffer()
创建本地 SDP 说明。 - 使用
RTCPeerConnection.setLocalDescription()
设置本地 SDP 说明。 - (使用信令服务)将本地 SDP 说明传输到远程对等方。
- 在
RTCPeerConnection
上注册一个icecandidate
事件的监听器。 - 对于每个
icecandidate
事件,请将其(使用信令服务)传输到远程对等方。 - 等待来自信号传输服务的传入远程 SDP 说明,并使用
RTCPeerConnection.setRemoteDescription()
进行设置。 - 等待来自信令服务的传入远程 ICE 候选路径,然后使用
RTCPeerConnection.addIceCandidate()
添加
在被调用方端,过程略有不同。
- 使用适当的 ICE 配置创建一个新的
RTCPeerConnection
实例。 - 等待来自信号传输服务的传入远程 SDP 说明,并使用
RTCPeerConnection.setRemoteDescription()
进行设置。 - 通过调用
RTCPeerConnection.createAnswer()
为远程 SDP 说明创建答案。 - 将答案传输(使用信令服务)到远程对等网络。
- 在
RTCPeerConnection
上注册一个icecandidate
事件的监听器。 - 对于每个
icecandidate
事件,请将其(使用信令服务)传输到远程对等方。 - 等待来自信令服务的传入远程 ICE 候选路径,然后使用
RTCPeerConnection.addIceCandidate()
添加
使用此 API 面临的挑战是大多数操作都是异步的,这通常会使 WebRTC 应用的实际实现变得复杂。许多函数会返回一个 Promise
,必须先解析该进程中的下一个步骤。
建议使用此 API 实现应用时,开发者使用 async
和 await
,而不要使用 Promise.then()
注册监听器,因为这样更便于您的代码编写。请参考以下示例:
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
使用 async
和 await
编写上面的代码时,我们会获得以下内容:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}