peer_connection.onicecandidate()函数做什么?什么是ice_event?

时间:2015-04-01 05:39:53

标签: javascript webrtc

我很难理解onicecandidate功能的目的。 冰候选人如何帮助建立同伴关系。谁先发送冰候选人?

3 个答案:

答案 0 :(得分:2)

  • 在幕后,webrtc根据可用的网络连接收集本地候选人,以及通过JS API传递给它的冰服务器列表。
  • 一旦冰候选者准备就绪,它将通过onicecandidate API提供给JS层。
  • 如果你正在使用滴流ICE,你可以立即通过信令路径将候选人发送到远程对等体。否则,等待最后一个(空)候选,按优先级排序,将它们添加到商品/答案sdp,并通过信令路径发送商品/答案。这通常由浏览器自动完成。
  • 您可以在此处查看握手规范: https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-09

答案 1 :(得分:1)

对等设备将无法使用自己的私有IP将媒体流式传输到其他对等方。因此,我们需要NAT遍历服务器(ICE服务器)将私有IP映射到公共IP。

因此客户端应用程序应该向ICE服务器询问他自己的ICE候选人“这是公共ID”。

首先,呼叫者将要求他的公共IP(ICE候选者)并通过信令服务器将其发送给另一个对等体。

当另一个人收到候选人时,他也向ICE服务器询问他自己的候选人并将其发回给来电者。

当两个对等方互相拥有冰候选者(公共IP)时,他们就可以进行P2P流媒体传输。

enter image description here

ICE问题

20%ICE服务器 - STUN协议在提供公共IP时将失败。因为这两个媒体设备都位于对称NAT后面!或防火墙阻止的P2P流量!

在这种情况下,P2P流媒体将不可靠! 要解决这些问题,我们必须使用外部媒体中继服务器 - TURN服务器,它是ICE服务器支持的协议

enter image description here

答案 2 :(得分:0)

以下是一个例子:

connection.onicecandidate = function(newRTCPeerConnectionIceEvent) {

    // a new candidate has been created
    var newRTCIceCandidate = newRTCPeerConnectionIceEvent.candidate;
    // could send this to the remote peer
};

候选人代表媒体流的目的地(发送或接收),在SDP中将显示如下内容:

a=candidate:1 1 UDP 2130706431 10.0.1.1 8998 typ host