对等连接

RTCPeerConnection 是 WebRTC API 中的中心接口。它表示本地和远程对等设备之间的连接,并提供建立连接所需的所有函数和事件。

建立对等连接

实现 WebRTC 功能的应用通常在很大程度上依赖于 RTCPeerConnection 接口。从调用方端(即发起连接的对等方)开始建立连接的过程通常如下:

  1. 使用适当的 ICE 配置创建一个新的 RTCPeerConnection 实例。
  2. 使用 RTCPeerConnection.createOffer() 创建本地 SDP 说明。
  3. 使用 RTCPeerConnection.setLocalDescription() 设置本地 SDP 说明。
  4. (使用信令服务)将本地 SDP 说明传输到远程对等方。
  5. RTCPeerConnection 上注册一个 icecandidate 事件的监听器。
  6. 对于每个 icecandidate 事件,请将其(使用信令服务)传输到远程对等方。
  7. 等待来自信号传输服务的传入远程 SDP 说明,并使用 RTCPeerConnection.setRemoteDescription() 进行设置。
  8. 等待来自信令服务的传入远程 ICE 候选路径,然后使用 RTCPeerConnection.addIceCandidate() 添加

在被调用方端,过程略有不同。

  1. 使用适当的 ICE 配置创建一个新的 RTCPeerConnection 实例。
  2. 等待来自信号传输服务的传入远程 SDP 说明,并使用 RTCPeerConnection.setRemoteDescription() 进行设置。
  3. 通过调用 RTCPeerConnection.createAnswer() 为远程 SDP 说明创建答案。
  4. 将答案传输(使用信令服务)到远程对等网络。
  5. RTCPeerConnection 上注册一个 icecandidate 事件的监听器。
  6. 对于每个 icecandidate 事件,请将其(使用信令服务)传输到远程对等方。
  7. 等待来自信令服务的传入远程 ICE 候选路径,然后使用 RTCPeerConnection.addIceCandidate() 添加

使用此 API 面临的挑战是大多数操作都是异步的,这通常会使 WebRTC 应用的实际实现变得复杂。许多函数会返回一个 Promise,必须先解析该进程中的下一个步骤。

建议使用此 API 实现应用时,开发者使用 asyncawait,而不要使用 Promise.then() 注册监听器,因为这样更便于您的代码编写。请参考以下示例:

function createAndSendOffer(peerConnection, signallingService) {
    peerConnection.createOffer()
                  .then(offer => {
                      signallingService.send({
                          type: 'offer',
                          data: offer
                      });
                  });
}

使用 asyncawait 编写上面的代码时,我们会获得以下内容:

async function createAndSendOffer(peerConnection, signallingService) {
    const offer = await peerConnection.createOffer();
    signallingService.send({
        type: 'offer',
        data: offer
    });
}