主要是WebRTC工作正常,但有时候,一些调用失败了。例如,未建立20个呼叫中的一个,因为PeerConnection无法开始工作。
让我们看看来电者方面的正确工作流程。
-> create offer
-> (sdp observer) getting SDP
-> (peer observer) start gathering candidates
-> (peer observer) adding candidates to SDP
-> set local description with type - offer
-> (signaling) sending SDP
**** accepting call in other side ****
-> (signaling) receive answer SDP
-> set remote description with type - answer
-> (establishing call)
-> ...................
为了澄清事情,我想展示一下Callee方面的呼叫流程。但我认为每个WebRTC应用程序都是相同的流程,而不仅仅是我的问题。
-> (signaling) receiving SDP offer
***** accepting call ****
-> set remote description type offer
-> create answer
-> (sdp observer) getting SDP
-> (peer observer) start gathering candidates
-> (peer observer) adding candidates to SDP
-> set local description with type - answer
-> (signaling) sending SDP answer
-> ...................
现在,我们对正确的呼叫流程充满信心。这是问题所在。 WebRTC不时调用失败,因为PeerConnection.Observer没有接收到onIceConnectionChange(PeerConnection.IceConnectionState iceConnectionState)。因此,当呼叫失败并且成功时,我从设备收到相同的日志,只有一个区别。 如果呼叫失败,PeerConnection.Observer状态,没有将状态从NEW更改为CHECKING!为什么会这样?
正如我之前所说,它只是时间发生。但还是不明白有什么不对?因为调用之间只有一个区别,所以它的PeerConnection改变了观察者状态。也许我只使用单个RELAY候选人来建立电话,也许我这么快就收集候选人?
答案 0 :(得分:1)
正如@Mattm已经提到的,这与ICE
有很大关系。你有STUN/TURN
服务器吗?如果没有,请尝试here。创建一个帐户,并在创建peerconnection
时使用numb.viagenie.ca:3478
作为ICE
服务器。
在本地网络之外,您必须处理更严格的防火墙,STUN
服务器可以“打孔”#34; (开放端口)允许客户端之间的对等连接。在生产中使用WebRTC
时,您需要一个。不要担心有很多公共场所,或者如果你愿意,你可以自己主持一个。
当在严格NAT
后面的客户端之间建立连接时(在蜂窝和学校/公司网络上发生很多事情),您通常无法将它们与点对点连接起来。那就是TURN
进来的地方,它是一个中继服务器,允许所有客户端通过它发送数据/媒体。
TURN
协议还实现了STUN
协议,因此如果您使用单个TURN
服务器,那么您就可以了。当您扩展到大量客户端时,您可能需要考虑托管多个客户端。