对等连接

RTCPeerConnection 是 WebRTC API 的中心接口。它 表示本地与远程对等方之间的连接, 函数和事件。

建立对等连接

实现 WebRTC 功能的应用通常严重依赖 RTCPeerConnection 接口。从调用方方面(即对等方) 发起连接),建立连接的过程通常是 以下:

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

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

  1. 使用适当的 ICE 创建一个新的 RTCPeerConnection 实例 配置。
  2. 等待信号传输服务收到远程 SDP 说明,然后 使用 RTCPeerConnection.setRemoteDescription() 进行设置。
  3. 通过调用以下函数为远程 SDP 说明创建答案: RTCPeerConnection.createAnswer()
  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
    });
}