6

在 iOS 11(iPhone 5s 和 iPhone 7)或桌面上使用 Safari 11 时,我的 Web 应用程序无法通过 CoTURN 服务器收集 WebRTC 中继 ICE 候选者。Web 应用程序(建立单向音频 WebRTC 对等连接)直接或通过 CoTURN 中继在真实浏览器(Chrome 和 Firefox)之间正常工作,我通常在这些浏览器上获得 6-15 个 ICE 候选者。

我在接收端有一个(坦率地说,不必要的)调用 getUserMedia,它允许 Safari 生成主机 ICE 候选对象。(注意......用户必须在 Safari 提供主机 Ice Candidates 之前批准音频和/或视频访问权限,即使是在仅接收端。我已经克服了这个障碍,但只是这样你就不会碰到它。 ..这是出于“隐私”问题。)。在我添加允许 getUserMedia 之前,我没有收到任何 ICE。现在我收到了两个候选人。一个使用私有 IPv4,另一个使用 IPv6。这足以让应用程序在同一台机器或本地网络上正常工作。所以我对应用程序代码的其他部分非常有信心。我不确定我的问题是与应用程序代码还是 CoTURN 服务器有关。

收到的 ICE 候选人示例:

{"candidate":{"candidate":"candidate:622522263 1 udp 2113937151 172.27.0.65 56182 typ host generation 0 ufrag r23H network-cost 50","sdpMid":"audio","sdpMLineIndex":0,"usernameFragment":"r23H"}}

我很确定我的 RTCPeerConnection 的 RTCIceServer 字典符合以下标准:

而且我尝试了多种参数变体:

// For Example:
var RPCconfig = {
    iceServers: [{ 
        urls: "turn:Example.live",
        username: "un",
        credential: "pw"
        }] 
     };

// Or:    
var RPCconfig = {
    iceServers: [{ 
        urls: "turns:Example.live",
        username: "un",
        credential: "pw",
        credentialType: "password"
        }, {
        urls: "stun:Example.live"
        }] 
    };

// And even more desperate attempts...
var RPCconfig = {
    iceServers: [{ 
        urls: "turn:Example.live?transport=tcp",
        username: "un",
        credential: "pw",
        credentialType: "password"
        }] 
};

这是一个信令过程日志的示例,用于了解正在发生的事情。这是来自接收方,即 Safari 11。另一个浏览器是 Chrome(比较 6 对 2 个 ICE 候选)。状态变化是指oniceconnectionstatechange

SDP Offer received. 
Sending signal SDP 
Sending signal IceCandidate
Sending signal IceCandidate 
ICE Candidate Received 
4:08:25 AM State Change -> checking 
ICE Candidate Received 
ICE Candidate Received 
ICE Candidate Received 
ICE Candidate Received 
ICE Candidate Received
4:08:40 AM State Change -> failed

据我所知,CoTURN 在接受所有可能的传输方法方面的配置相当宽松。它适用于提供 ICE Candidates 并作为其他浏览器的中继。

任何方向将不胜感激。即使它只是一个有效的示例 RTCIceServer 字典代码或一个经过验证的 TURN 服务器尝试。

4

0 回答 0