如何在 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 以外的线程来关闭连接似乎是解决方法。
我正在使用版本为“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 的根本问题是我正在从 WebRTC 信号线程上 运行 的 peerConnection 回调之一关闭 peerConnection。导致死锁。
切换到 WebRTC 以外的线程来关闭连接似乎是解决方法。