0

如果广播应用程序(Android)和客户端应用程序(IOS 和 Android)连接到同一网络中的 wifi,则一切正常。但是当广播者应用程序连接到移动数据连接时,客户端应用程序(IOS)显示黑屏,但 Android 仍然可以正常工作。我已经搜索了一些解决方法,他们建议在我的 peerConnection 中添加 STUN 和 TURN,但我之前已经添加了。在不同的网络连接上建立通信时似乎不起作用。这就是我设置 RTCPeerConnection 的方式。

 var rtcIceServers: [RTCIceServer] = []
    rtcIceServers.append(RTCIceServer(urlStrings: [turnUrl], username:"*****",credential: "*********"))
    rtcIceServers.append(RTCIceServer(urlStrings: [stunUrl]))
    
    let rtcConf = RTCConfiguration()
    rtcConf.iceServers = rtcIceServers
    rtcConf.tcpCandidatePolicy = .disabled
    rtcConf.bundlePolicy = RTCBundlePolicy.maxBundle
    rtcConf.rtcpMuxPolicy = RTCRtcpMuxPolicy.require
    rtcConf.continualGatheringPolicy = RTCContinualGatheringPolicy.gatherContinually
    rtcConf.keyType = .ECDSA
      let mediaConstraints = RTCMediaConstraints.init(mandatoryConstraints: mandatoryConstraints, optionalConstraints: nil)
    let pc = self.peerConnectionFactory.peerConnection(with: rtcConf, constraints: mediaConstraints, delegate: self)

客户端应用程序只需要接收视频轨道,强制约束中不添加音频。谢谢

4

1 回答 1

0

经过几天的调试并将我的设置与其他来源进行比较后,我通过在添加到 peerConnection 之前将正确的参数应用于我的 RTCIceCandidate 解决了这个问题。我错误地将候选值应用于 sdpMid 参数并将 id 值应用于 sdp 参数。因为如果两个客户端都在同一个网络连接中一切正常,我从不怀疑我的参数,直到我明白了为什么当客户端不在同一个网络中时我需要使用 IceServers。所以 RTCIceCandidate 值并不是很重要,当客户端在同一个网络中时,这些冰服务器也是如此,即使 RTCIceCandidate 应用了错误的参数,它也能正常工作。我的错...

RTCIceCandidate(sdp: id, sdpMLineIndex: label, sdpMid: candidate)// wrong



RTCIceCandidate(sdp: candidate, sdpMLineIndex: label, sdpMid: id)// correct
于 2021-02-20T22:24:56.473 回答