当不同网络上的对等点时,RTCPeerConnection 失败

Posted

技术标签:

【中文标题】当不同网络上的对等点时,RTCPeerConnection 失败【英文标题】:RTCPeerConnection fails when peers on different networks 【发布时间】:2021-10-30 07:23:01 【问题描述】:

我有一个原型网络应用程序,它使用 WebRTC javascript API 进行(单向)实时视频流传输(使用 RTCPeerConnection API),旨在从桌面网络应用程序流式传输到 ios 混合应用程序。

在当前状态下,当两个设备处于同一 WiFi 连接时,应用程序成功地流式传输视频。但是,当我为 iOS 对等端关闭 WiFi,并使用移动数据/4G 连接,然后尝试重新协商 RTCPeerConnection 时,RTCPeerConnection 以失败状态结束。

我正在向 RTCPeerConnection 实例提供 Google 的公共 STUN 服务器。

        const config: RTCConfiguration = 
            'iceServers': [
                
                    'urls': [
                        'stun:stun.l.google.com:19302',
                        'stun:stun1.l.google.com:19302',
                        'stun:stun2.l.google.com:19302',
                        'stun:stun3.l.google.com:19302',
                        'stun:stun4.l.google.com:19302',
                    ]
                ,
            ]
        
        let peer = new RTCPeerConnection(config)

我不确定还有哪些其他代码可以帮助调试它。同样,当对等方位于同一个 WiFi 网络上时,它会按预期工作。如果我将第二个对等点(iOS 设备)从 WiFi 中取出并使用移动数据,它会停止工作,并且 RTCPeerConnection 最终具有 ICE 连接状态failed。如果设备都在 WiFi 上,但在不同的 WiFi 网络上,我无法测试会发生什么。

如果有人对调试有任何建议,我也将不胜感激。我附加了一些事件处理程序来尝试调试。

        peer.oniceconnectionstatechange = (ev: Event) => 
            console.log('RTCPeerConnection ICE state change', peer.iceConnectionState, JSON.stringify(ev))
        

        peer.onicecandidateerror = (ev: RTCPeerConnectionIceErrorEvent) => 
            console.log('ice candidate error', JSON.stringify(ev))
        

从第一个,我得到这个日志行:

RTCPeerConnection ICE state change disconnected "isTrusted":true

然而,后一个,on error handler,永远不会被调用。

【问题讨论】:

【参考方案1】:

1/ STUN 服务器不保证可以建立连接。需要 TURN 服务器以获得更高的成功率。

2/ onicecandidate 错误仅处理与收集本地候选人相关的错误,而不是未能建立与对等点的连接,这是预期的。

【讨论】:

以上是关于当不同网络上的对等点时,RTCPeerConnection 失败的主要内容,如果未能解决你的问题,请参考以下文章

当工具提示在 ng-bootstrap 中到达 y 轴上的某个点时,是不是可以更改工具提示的位置?

Django - 当用户选择地图上的点时,如何以模式形式包含地图并将坐标保存到数据库?

使用自己的地图,如谷歌地图。当访问者点击地图上的点时收集和处理数据

在 Windows 上获取对等套接字的 PID

无法添加以太坊对等点。对等列表为空

当外部端口不断变化时,natted 网络中对等点之间的 P2P