Я пытаюсь добиться аудиовызова с помощью WebRTC. У меня есть стручки:
pod 'Starscream', '~> 2.0.4'
pod 'libjingle_peerconnection'
Когда я пытаюсь отправить SDP, полученный в качестве ответа, это не удается. Я здесь привожу отдельные строки кода, так как он слишком длинный.
Подключить розетку
self.socket?.connect()
Когда сокет получит статус подключения, инициализируйте 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() }
Вот мои конфигурации
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 }
Создать оффер с помощью WebRTC
self.peerConnection?.createOffer(with: self, constraints: constraint)
Записать данные в сокет
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)
В случае успеха я получил 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": принято]
Отправляю тот же sdp в качестве ответа
self.peerConnection?.setRemoteDescriptionWith(self, sessionDescription: rtcSessionDesc!)
Получил состояние iceGathering Поменял на 2 (собирает). но через несколько секунд состояние iceConnection изменилось на 4 (сбой)
Где я не прав?