检测本地浏览器是不是支持 ICE 涓流

Posted

技术标签:

【中文标题】检测本地浏览器是不是支持 ICE 涓流【英文标题】:Detect whether local browser supports ICE trickle检测本地浏览器是否支持 ICE 涓流 【发布时间】:2017-08-06 10:44:47 【问题描述】:

为了支持任意客户端的 ICE-trickling,建议信令机制也支持信令以支持涓流。我的就是这样做的;对等点可以在初始信令握手中包含一个标志是否支持涓流,以便远程对等点可以决定涓流。

我遇到的问题是我不确定如何检测当前浏览器是否支持 ICE-trickling,因此它可以正确设置该标志。我尝试将其用作检测机制:

typeof RTCPeerConnection.prototype.addIceCandidate == 'function'

这是可靠的还是最好的,还是有更好的 API 或方法来查询本地对 ICE-trickling 的支持?

【问题讨论】:

所有支持WebRTC的浏览器都支持trickling。 我们测试过的所有相关浏览器似乎都是如此。然而,在过去的某个时候,这似乎不是真的。大多数关于滴流的信息都相当过时,并且来自那个有争议的时期。是否保证在任何浏览器支持它的地方?或者,某种检测支持的方法? 【参考方案1】:

所有现代 WebRTC 端点必须支持 Trickle ICE。

JSEP section 5.2.1 说:

必须添加带有“trickle”选项的“a=ice-options”行,如 [I-D.ietf-ice-trickle] 第 4 节中所述。

此外,根据我对 WebRTC 规范的阅读,对于要成为 conformant 的浏览器,它必须实现 addIceCandidate 等。

目前支持 WebRTC 的所有浏览器都支持滴流。以下在 Firefox 中返回 true(Chrome 似乎没有正确地发出这个信号,但请放心,它支持滴流):

new RTCPeerConnection().createOffer(offerToReceiveAudio: true)
.then(offer => console.log(offer.sdp.includes('\r\na=ice-options:trickle')))
.catch(e => log(e));

有趣的是,您可以使用 pc.canTrickleIceCandidates 属性来检测 remote 对等点是否支持流式传输,大概是为了支持连接到旧系统。以下在 Firefox 中生成 true(在 Chrome 中生成 undefined,需要符合规范):

var pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();

pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);

pc1.onnegotiationneeded = e =>
  pc1.createOffer().then(d => pc1.setLocalDescription(d))
  .then(() => pc2.setRemoteDescription(pc1.localDescription))
  .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(d))
  .then(() => pc1.setRemoteDescription(pc2.localDescription))
  .then(() => console.log(pc1.canTrickleIceCandidates))
  .catch(e => console.log(e));

pc1.createDataChannel("dummy");

【讨论】:

以上是关于检测本地浏览器是不是支持 ICE 涓流的主要内容,如果未能解决你的问题,请参考以下文章

如何检测浏览器是不是支持鼠标悬停事件?

检测浏览器是不是支持WebP格式? (服务器端)

检测浏览器是不是支持带有 iframe 的数据 uri 方案

如何(功能)检测浏览器是不是支持 WebM alpha 透明度?

检测浏览器/设备是不是支持双击事件

简单对等 WebRTC 错误:Ice 连接失败