如何在 iOS 中正确关闭 WebRTC peerConnection?

How to properly close WebRTC peerConnection in iOS?

我正在使用版本为“1.1.29400”的 'GoogleWebRTC' pod。我一直面临关闭对等连接的问题。无论哪个线程试图关闭连接,都会永远卡在以下行中。

self.peerConnection?.close()

所以我选择不关闭对等连接,而是手动销毁捕获器、轨道、渲染器、收发器并将引用设置为零。以为我解决了这个问题,但我没有。

现在开始面临 'RTCPeerConnectionFactory' 的问题。从工厂生成几个对等连接后,从工厂请求新的 peerConnection 的线程永远卡住了。

这是我初始化工厂的方式,

static let factory: RTCPeerConnectionFactory = {
    RTCInitializeSSL()
    let videoEncoderFactory = RTCDefaultVideoEncoderFactory()
    let videoDecoderFactory = RTCDefaultVideoDecoderFactory()
    return RTCPeerConnectionFactory(encoderFactory: videoEncoderFactory, decoderFactory: videoDecoderFactory)
}()

这是我初始化对等连接的方式,

let config = RTCConfiguration()
config.iceServers = iceServers
config.sdpSemantics = .unifiedPlan
config.continualGatheringPolicy = .gatherOnce
config.iceTransportPolicy = iceTransportPolicy

let constraints = RTCMediaConstraints(mandatoryConstraints: nil, optionalConstraints: ["DtlsSrtpKeyAgreement": kRTCMediaConstraintsValueTrue])

let factory = WebRtcClient.factory
self.peerConnection = factory.peerConnection(with: config, constraints: constraints, delegate: nil)

哪里出了问题?

并行 peerConnections 的数量是否有限制?

对 create/manipulate/destroy peerConnection 的线程类型是否有任何限制?

我应该设置对这些对象的同步访问吗?

看来我不是一个人!

我设法在 2020 年自己解决了它。离开 SO 有一段时间了,很抱歉回答晚了。 虽然我目前不在 WebRTC 上工作,但让我回忆一下并回答我的问题。希望它能帮助某人或至少给出一个方向。

我发现打开的 peerConnections 数量存在某种端口限制。这就是为什么从工厂请求新的 peerConnection 的线程在一定限制后卡住的原因。

我们必须使用 peerConnection.close() API.

正确关闭 peerConnections

阻止我关闭 peerConnections 的根本问题是我正在从 WebRTC 信号线程上 运行 的 peerConnection 回调之一关闭 peerConnection。导致死锁。

切换到 WebRTC 以外的线程来关闭连接似乎是解决方法。