IEnumerator GetOffer() { var op = signaling.GetOffer(sessionId, lastTimeGetOfferRequest); yield return(op); if (op.webRequest.isNetworkError) { Debug.LogError($"Network Error: {op.webRequest.error}"); yield break; } var date = DateTimeExtension.ParseHttpDate(op.webRequest.GetResponseHeader("Date")); lastTimeGetOfferRequest = date.ToJsMilliseconds(); var obj = op.webRequest.DownloadHandlerJson <OfferResDataList>().GetObject(); if (obj == null) { yield break; } foreach (var offer in obj.offers) { RTCSessionDescription _desc; _desc.type = RTCSdpType.Offer; _desc.sdp = offer.sdp; var connectionId = offer.connectionId; if (pcs.ContainsKey(connectionId)) { continue; } var pc = new RTCPeerConnection(); pc.OnStatsDelivered = (data) => Debug.Log(data); pcs.Add(offer.connectionId, pc); pc.OnDataChannel = new DelegateOnDataChannel(channel => { OnDataChannel(pc, channel); }); pc.SetConfiguration(ref conf); pc.OnIceCandidate = new DelegateOnIceCandidate(candidate => { StartCoroutine(OnIceCandidate(offer.connectionId, candidate)); }); pc.OnIceConnectionChange = new DelegateOnIceConnectionChange(state => { if (state == RTCIceConnectionState.Disconnected) { pc.Close(); } }); //make video bit rate starts at 16000kbits, and 160000kbits at max. string pattern = @"(a=fmtp:\d+ .*level-asymmetry-allowed=.*)\r\n"; _desc.sdp = Regex.Replace(_desc.sdp, pattern, "$1;x-google-start-bitrate=16000;x-google-max-bitrate=160000\r\n"); pc.SetRemoteDescription(ref _desc); foreach (var track in videoStream.GetTracks()) { pc.AddTrack(track); } foreach (var track in audioStream.GetTracks()) { pc.AddTrack(track); } StartCoroutine(Answer(connectionId)); } }
IEnumerator GetCandidate() { var op = signaling.GetCandidate(sessionId, lastTimeGetCandidateRequest); yield return(op); if (op.webRequest.isNetworkError) { Debug.LogError($"Network Error: {op.webRequest.error}"); yield break; } var date = DateTimeExtension.ParseHttpDate(op.webRequest.GetResponseHeader("Date")); lastTimeGetCandidateRequest = date.ToJsMilliseconds(); var obj = op.webRequest.DownloadHandlerJson <CandidateContainerResDataList>().GetObject(); if (obj == null) { yield break; } foreach (var candidateContainer in obj.candidates) { RTCPeerConnection pc; if (!pcs.TryGetValue(candidateContainer.connectionId, out pc)) { continue; } foreach (var candidate in candidateContainer.candidates) { RTCIceCandidate _candidate = default; _candidate.candidate = candidate.candidate; _candidate.sdpMLineIndex = candidate.sdpMLineIndex; _candidate.sdpMid = candidate.sdpMid; pcs[candidateContainer.connectionId].AddIceCandidate(ref _candidate); } } }