检测本地浏览器是不是支持 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 涓流的主要内容,如果未能解决你的问题,请参考以下文章
检测浏览器是不是支持带有 iframe 的数据 uri 方案