Я пытаюсь получить звук с сервера за пределами моей локальной сети. Мне нужно установить локальное описание, затем подождать, пока соберутся все кандидаты на лед, и установить удаленное описание. Есть функция onIceGatheringChange
, которая возвращает 'COMPLETE'
состояние, когда все ледяные кандидаты соберутся, но она завершается, когда соединение закрывается.
Конфигурация:
val rtcConfig = PeerConnection.RTCConfiguration(getIceServersList())
// TCP candidates are only useful when connecting to a server that supports ICE-TCP.
rtcConfig.enableDtlsSrtp = true
rtcConfig.enableRtpDataChannel = true
rtcConfig.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.DISABLED
rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXCOMPAT
rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE
rtcConfig.iceTransportsType = PeerConnection.IceTransportsType.ALL
rtcConfig.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLY
// Use ECDSA encryption.
rtcConfig.keyType = PeerConnection.KeyType.ECDSA
localPeer = peerConnectionFactory?.createPeerConnection(
rtcConfig, object : PeerConnectionObserverAdapter() {
override fun onAddStream(mediaStream: MediaStream) {
super.onAddStream(mediaStream)
gotRemoteStream(mediaStream)
}
override fun onIceCandidate(iceCandidate: IceCandidate) {
super.onIceCandidate(iceCandidate)
localPeer?.addIceCandidate(iceCandidate)
}
override fun onIceGatheringChange(iceGatheringState: PeerConnection.IceGatheringState) {
super.onIceGatheringChange(iceGatheringState)
if (iceGatheringState == PeerConnection.IceGatheringState.COMPLETE) {
sendRemoteOffer()
}
}
})
}
Есть много ответов о том, как ждать кандидатов в JS, а в android их различие в реализации. Буду рад, если вы мне объясните, что я сделал не так?