peer_connection.onicecandidate() 函数有什么作用?什么是 ice_event?

What does peer_connection.onicecandidate() function do?what is an ice_event?

我很难理解 onicecandidate 函数的用途。 ice candidates 如何帮助建立 peer connection.And 谁先发送 ice candidates?

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

对等设备将无法使用自己的私有 IP 将媒体流式传输到其他对等设备。所以我们需要 NAT 穿越服务器(ICE 服务器)将私有 IP 映射到 public 一个。

所以客户端应用程序应该向 ICE 服务器询问他自己的 ICE 候选 "which is the public id"。

首先,调用者会询问他的 public IP(ICE 候选者)并通过信令服务器将其发送给其他对等方。

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

当两个对等点都拥有彼此的 ice 候选者(public IP)时,他们可以进行 P2P 流式传输。

ICE 问题

20% ICE 服务器 - STUN 协议无法提供 public IP。因为要么两个媒体设备都位于对称 NAT 后面!或 P2P 流量被防火墙阻止!

那样的话P2P流媒体就不可靠了! 为了解决这些问题,我们必须使用外部媒体中继服务器——TURN 服务器,它是 ICE 服务器支持的协议

这是一个例子:

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