Day16 RTCPeerConnection: Offer / Answer

在前面的文章中,已经对 WebRTC 相关的重点进行了介绍,包含网络协商、媒体协商、如何进行网路穿透等,以及使用 WebRTC API 获取设备及音视讯,今天我们要来看 WebRTC API 中最重要的类别 RTCPeerConnectio ,先看一次通话的流程。

Offer / Answer 过程

Bob 要对 Alice发起通话:

https://ithelp.ithome.com.tw/upload/images/20210929/20130062GaJ0TTaz03.png

  1. Bob 呼叫 RTCPeerConnection.createOffer 建立一个 offer ,并呼叫 setLocalDescription 设定本地的 SDP。
  2. 通过 Signaling server 将包含 Bob SDP 的offer 发送给 Alice。
  3. Alice 收到 offer 後呼叫 setRemoteDescription 设定 Bob 的 SDP。
  4. Alice 呼叫 RTCPeerConnection.createAnswer 建立一个 answer ,并呼叫 setLocalDescription 设定本地的 SDP。
  5. 通过 Signaling server 将包含 Alice SDP 的 answer 发送给 Bob 。
  6. Bob 收到 answer 後呼叫 setRemoteDescription 设定 Alice 的SDP

回顾前几篇 Bob 与 Alice 的通话过程,今天我们来看看如何透过 WebRTC API 来实现这个流程,可以把以下程序码贴到 Chrome 的 console 中测试看看:

var BobPC, AlicePC, offer, answer

BobPC = new RTCPeerConnection()
AlicePC = new RTCPeerConnection()

BobPC.onicecandidate = function (e) {
  AlicePC.addIceCandidate(e.candidate)
}

AlicePC.onicecandidate = function (e) {
  BobPC.addIceCandidate(e.candidate)
}

function onError(err) {
  window.alert(err.message)
}

// 1. Bob 呼叫 RTCPeerConnection.createOffer 建立一个 offer
BobPC
  .createOffer({
    offerToReceiveAudio: false,
    offerToReceiveVideo: true,
  }).then(gotLocalDescription)

function gotLocalDescription(description) {
  offer = description
  BobPC.setLocalDescription(description)
  // 2. 通过 Signaling server 将包含 Bob SDP 的offer 发送给 Alice
  // 3. Alice 收到 offer 後呼叫 setRemoteDescription 设定 Bob 的 SDP
  AlicePC.setRemoteDescription(offer)
  // 4. Alice 呼叫 RTCPeerConnection.createAnswer 建立一个 answer
  AlicePC.createAnswer().then(gotAnswerDescription)
}

function gotAnswerDescription(description) {
  AlicePC.setLocalDescription(description)
  answer = description
  // 5. 通过 Signaling server 将包含 Alice SDP 的 answer 发送给 Bob
  // 6. Bob 收到 answer  後呼叫 setRemoteDescription 设定 Alice 的SDP
  BobPC.setRemoteDescription(answer)
  console.log('完成 Offer/Answer 的交换')
  console.log(offer)
  console.log(answer);
}

<<:  予焦啦!实作上下文机制

>>:  第二十五天:用 dokka 产生 API 文件

[解题纪录] Coin Rows

题目 题目大意 Alice跟Bob要在一个矩阵上玩游戏,这个矩阵有2个rows、m个columns,...

[Day-18] 一维阵列小练习

上次学习了基本的阵列语法 这次要来练习简单的阵列使用 都是基本的宣告以及画面显示 主要是练习一维阵列...

DAY 21 制作 Nav Bar - FontAwesome

FontAwesome FontAwesome 让我们可以快速方便的使用 Icon 的设计,不过他有...

伸缩自如的Flask [day15] boostrap 4.6

首先可以谈谈为甚麽采用boostrap这个框架,我想是因为可以快速搭建一个不难看的网页而且能同时具备...

Dynamic Time Warping (DTW)

DTW 是什麽 当要计算时间序列资料的相似程度时,我们可以使用不同的距离计算方式。DTW就是其中一种...