Как правильно закрыть WebRTC peerConnection в iOS?

Я использую модуль "GoogleWebRTC" с версией "1.1.29400". Я столкнулся с проблемами при закрытии одноранговых соединений. Какой бы поток ни пытался закрыть соединение, он навсегда застревает в следующей строке.

self.peerConnection?.close()

Поэтому я решил не закрывать одноранговое соединение, вместо этого я вручную уничтожил устройство захвата, треки, рендереры, трансиверы и установил ссылку на nil. Думал, что решил проблему, но не стал.

Теперь начались проблемы с 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)

Что могло пойти не так?

Есть ли ограничения на количество параллельных одноранговых соединений?

Существуют ли какие-либо ограничения на типы потоков, которые создают / управляют / уничтожают peerConnection?

Стоит ли настраивать синхронный доступ к этим объектам?

1 ответ

Решение

Кажется, я не одинок!

Мне удалось решить это в самом 2020 году. Некоторое время был вдали от SO, извините за поздний ответ. Хотя в настоящее время я не работаю над WebRTC, позвольте мне вспомнить и ответить на мою проблему. Надеюсь, это поможет кому-то или, по крайней мере, даст направление.

Я обнаружил, что существует какое-то ограничение на количество открытых одноранговых соединений. Вот почему поток, который запросил новое peerConnection от фабрики, завис после определенного предела.

Мы должны правильно закрыть peerConnections, используя peerConnection.close() API.

Основная проблема, которая помешала мне закрыть peerConnections, заключалась в том, что я закрывал peerConnection из одного из обратных вызовов peerConnection, который выполнялся в сигнальном потоке WebRTC. Это привело к тупику.

Переключение на поток, отличный от WebRTC, чтобы закрыть соединение, кажется исправлением.

Другие вопросы по тегам