RTCICEConnectionFailed быстро

Я пытаюсь добиться аудиовызова с помощью WebRTC. У меня есть стручки:

pod 'Starscream', '~> 2.0.4'
pod 'libjingle_peerconnection'

Когда я пытаюсь отправить SDP, полученный в качестве ответа, это не удается. Я здесь привожу отдельные строки кода, так как он слишком длинный.

  1. Подключить розетку

    self.socket?.connect()
    
  2. Когда сокет получит статус подключения, инициализируйте WebRTC

    func initalizeWebRTC() -> Void {
    print("----------------initalizeWebRTC----------------")
    
    RTCPeerConnectionFactory.initializeSSL()
    self.webRtcClient  = RTCPeerConnectionFactory.init()
    let stunServer = self.defaultStunServer()
    let defaultConstraint = self.createDefaultConstraint()
    self.peerConnection = self.webRtcClient?.peerConnection(withICEServers: [stunServer], constraints: defaultConstraint, delegate: self)
    
    self.localVideoView.delegate = self
    self.remoteVideoView.delegate = self
    // webrtc initalized local rendering of video on
    self.addLocalMediaStrem()
    
    }
    
  3. Вот мои конфигурации

    func defaultStunServer() -> RTCICEServer {
    print("----------------defaultStunServer----------------")
    let url = URL.init(string: stunServer);
    let iceServer = RTCICEServer.init(uri: url, username: "", password: "")
    return iceServer!
    }
    
    func createAudioVideoConstraints() -> RTCMediaConstraints{
    print("----------------createAudioVideoConstraints----------------")
    let audioOffer : RTCPair = RTCPair(key: "OfferToReceiveAudio", value: "true")
    let videoOffer : RTCPair = RTCPair(key: "OfferToReceiveVideo", value: "false")
    let dtlsSrtpKeyAgreement : RTCPair = RTCPair(key: "DtlsSrtpKeyAgreement", value: "true")
    
    let connectConstraints : RTCMediaConstraints = RTCMediaConstraints.init(mandatoryConstraints: [audioOffer,videoOffer], optionalConstraints: [dtlsSrtpKeyAgreement])
    
    return connectConstraints
    }
    
    func createDefaultConstraint() -> RTCMediaConstraints {
    print("----------------createDefaultConstraint----------------")
      let dtlsSrtpKeyAgreement : RTCPair = RTCPair(key: "DtlsSrtpKeyAgreement", value: "true")
    let connectConstraints : RTCMediaConstraints = RTCMediaConstraints.init(mandatoryConstraints: nil, optionalConstraints: [dtlsSrtpKeyAgreement])
    
    return connectConstraints
    }
    
  4. Создать оффер с помощью WebRTC

    self.peerConnection?.createOffer(with: self, constraints: constraint)
    
  5. Записать данные в сокет

    let offerDict =  ["id":"joinRoomPresenter","name":fileName,"roomName":fileName,"isFrontCamera":"false","isMicroPhone":"false","isPhoneAudio":"false","isChat":"false","isOneToOneSession":"false","accessToken":"9289010e-d2d5-42e8-a95c-212f06aa9238","userId":"3459","fileName":fileName,"portalId":voiceCallID,"personName":fileName,"photoURL":"","sdpOffer":sdp.description] as [String : Any]
    socket?.write(string: offerDict.json)
    
  6. В случае успеха я получил sip как сообщение от сокета.

["sdpAnswer": v = 0

o=- 544328641767753251 2 IN IP4 104.248.181.233

s = VideoRoom 2623889018315199

t=0 0

a = group: BUNDLE audio

a = msid-semantic: WMS janus

m = аудио 9 UDP / TLS / RTP / SAVPF 111

c=IN IP4 104.248.181.233

a = recvonly

а = середина: аудио

а = rtcp-mux

а = лед-уфраг: SJ8U

a = ice-pwd: 72CaTpbKHUzwWj7rX64cGn

а = варианты льда: струйка

a = отпечаток пальца: sha-256 13: 2A: 57: AA: FC: AE: 2B: 44: 86: 1A: FD: FD: 77: 4A: 11: BD: 78: 60: A3: 4E: D1: 98 : 3C: 43: 1C: 71: 82: C7: 88: EE: 01: CC

a = настройка: активна

а = rtpmap: 111 опус / 48000/2

a = extmap: 1 urn: ietf: params: rtp-hdrext: ssrc-audio-level

a = msid: janus janusa0

a = ssrc: 1319411670 cname: janus

a = ssrc: 1319411670 msid: janus janusa0

a = ssrc: 1319411670 mslabel: janus

a = ssrc: 1319411670 этикетка: janusa0

a = кандидат: 1 1 udp 2013266431 104.248.181.233 57307 тип хост

a = кандидат: 2 1 udp 2013266430 10.46.0.9 56250 тип хост

a = конец кандидатов

, "id": joinRoomPresenterResponse, "response": принято]

  1. Отправляю тот же sdp в качестве ответа

    self.peerConnection?.setRemoteDescriptionWith(self, sessionDescription: rtcSessionDesc!)
    
  2. Получил состояние iceGathering Поменял на 2 (собирает). но через несколько секунд состояние iceConnection изменилось на 4 (сбой)

Где я не прав?


person Krutika Sonawala    schedule 12.08.2019    source источник
comment
Вы использовали новую библиотеку модуля GoogleWebRTC или все еще работаете с модулем libjingle_peerconnection ?? и успешно ли вы отправили данные   -  person Muhammad Faizan    schedule 08.04.2020


Ответы (1)


Для начала, libjingle довольно старый (2016). Я бы попробовал pod GoogleWebRTC, он постоянно обновляется из их репо.

В отправке сокета у вас есть "isMicroPhone": "false", "isPhoneAudio": "false" Если это голос, разве это не должно быть правдой?

Я бы попробовал основной пример приложения Googles и пошел бы оттуда. Иногда бывает сложно выполнить все шаги при подключении к webrtc.

person John Lanzivision    schedule 12.08.2019
comment
Я использовал библиотеку libjingle, но мы не могли передавать сообщения через канал данных. Следует ли мне использовать модуль GoogleWebRTC? - person shayan; 08.04.2020