WebRTC:为什么 Offer 需要仅针对 DataChannel 打开/启用音频或视频选项?

ElS*_*jko 6 javascript peer webrtc

我试图了解 WebRTC 的工作原理,主要是仅使用 DataChannel 来获得游戏网络体验。这就是我到目前为止所做的。它聚集了 ICE 候选人。我有两个问题。

  1. 收集ICE需要提供offer吗?
  2. 为什么offerToReceiveAudioorofferToReceiveVideo需要设置为 true,我只会使用Datachannel. (如果没有将此选项之一设置为 true,则不会出现 ICE)(已解决,请参阅下面的编辑)

这是一个小提琴:

https://jsfiddle.net/t431a815/9/

和代码:

var iceServers = [

] 

var config = {
  iceServers: iceServers,
  iceTransportPolicy: "all",
  rtcpMuxPolicy: 'negotiate'
};

var pcConstraints = {};
var offerOptions = {offerToReceiveAudio: true};

pcConstraints.optional = [{'googIPv6': true}]; // Whether we gather IPv6 candidates.

var pc = new RTCPeerConnection(config, pcConstraints);
pc.onicecandidate = iceCallback;
pc.createOffer(
  offerOptions
).then(
  gotDescription,
  error
);

function gotDescription(desc) {
  console.log("OFFER DESC:", desc);
  pc.setLocalDescription(desc);
}

function error() {
  console.log("sth goes wrong", arguments);
}

function iceCallback(event) {
  console.log("ICE!", JSON.stringify(event.candidate));
}
Run Code Online (Sandbox Code Playgroud)

编辑:

找到了解决方案,但很奇怪,您只需要在报价之前创建一个数据通道,然后它就可以使用offerToReceiveAudio: false, offerToReceiveVideo: false

var offererDataChannel = pc.createDataChannel('channel', {});
Run Code Online (Sandbox Code Playgroud)

但为什么?如果我想稍后创建它怎么办?

jib*_*jib 4

你需要发送一些东西。否则,这就像运送一个里面空无一物的盒子,或者流式传输没有内容的流。没有任何好处。

建立对等连接的所有工作都是为每个需要发送的内容协商工作 IP+端口对。例如,一对用于视频、一对用于音频、和/或一对用于数据。

最容易看出这一点的是每件产品在报价 SDP 中都需要自己的“m 线”。

var pc = new RTCPeerConnection();

pc.createDataChannel("dummy");
pc.createOffer().then(({sdp}) =>
   sdp.split('\r\n').filter(s => s.startsWith('m=')).map(s => console.log(s)));
Run Code Online (Sandbox Code Playgroud)
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
Run Code Online (Sandbox Code Playgroud)

稍后添加视频或音频(或者如果最初没有数据则添加数据)需要重新协商,这与初始协商的成本相同。

例外的是额外的数据通道,它们都通过同一端口进行多路复用,无需重新协商,因为,您知道,现在对等点之间有一个数据通道。

换句话说,如果您想稍后添加数据通道,请预先创建一个虚拟通道。随后所有的数据通道基本上都是免费的。相反,如果您稍后需要费用,请稍后连接。