private void AddTracks() { var pc1VideoSenders = new List <RTCRtpSender>(); foreach (var track in sendStream.GetTracks()) { var sender = _pc1.AddTrack(track, sendStream); if (track.Kind == TrackKind.Video) { pc1VideoSenders.Add(sender); } } if (WebRTCSettings.UseVideoCodec != null) { var codecs = new[] { WebRTCSettings.UseVideoCodec }; foreach (var transceiver in _pc1.GetTransceivers()) { if (pc1VideoSenders.Contains(transceiver.Sender)) { transceiver.SetCodecPreferences(codecs); } } } }
private void AddTracks() { foreach (var track in sendStream.GetTracks()) { _pc1.AddTrack(track, sendStream); } }
public IEnumerator ReceiverGetStreams() { var obj = new GameObject("audio"); var source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 480, 2, 48000, false); var audioTrack = new AudioStreamTrack(source); var stream = new MediaStream(); stream.AddTrack(audioTrack); yield return(0); var test = new MonoBehaviourTest <SignalingPeers>(); test.component.AddStream(0, stream); yield return(test); foreach (var receiver in test.component.GetPeerReceivers(1)) { Assert.That(receiver.Streams, Has.Count.EqualTo(1)); } test.component.Dispose(); foreach (var track in stream.GetTracks()) { track.Dispose(); } stream.Dispose(); Object.DestroyImmediate(test.gameObject); Object.DestroyImmediate(source.clip); Object.DestroyImmediate(obj); }
public void AddStream(int indexPeer, MediaStream stream) { foreach (var track in stream.GetTracks()) { peers[0].AddTrack(track, stream); } }
private void AddTracks() { foreach (var track in videoStream.GetTracks()) { pc1Senders.Add(_pc1.AddTrack(track, videoStream)); } if (WebRTCSettings.UseVideoCodec != null) { var codecs = new[] { WebRTCSettings.UseVideoCodec }; foreach (var transceiver in _pc1.GetTransceivers()) { if (pc1Senders.Contains(transceiver.Sender)) { transceiver.SetCodecPreferences(codecs); } } } if (!videoUpdateStarted) { StartCoroutine(WebRTC.Update()); videoUpdateStarted = true; } }
private void Call() { Debug.Log("Starting calls"); pcLocal = new RTCPeerConnection(ref configuration); pcRemote = new RTCPeerConnection(ref configuration); pcRemote.OnTrack = e => receiveVideoStream.AddTrack(e.Track); pcLocal.OnIceCandidate = candidate => pcRemote.AddIceCandidate(candidate); pcRemote.OnIceCandidate = candidate => pcLocal.AddIceCandidate(candidate); Debug.Log("pc1: created local and remote peer connection object"); foreach (var track in sourceVideoStream.GetTracks()) { pcLocal.AddTrack(track, sourceVideoStream); } Debug.Log("Adding local stream to pcLocal"); callButton.interactable = false; createOfferButton.interactable = true; createAnswerButton.interactable = true; setOfferButton.interactable = true; setAnswerButton.interactable = true; hangUpButton.interactable = true; }
public IEnumerator ReceiverGetStreams() { var audioTrack = new AudioStreamTrack(); var stream = new MediaStream(); stream.AddTrack(audioTrack); yield return(0); var test = new MonoBehaviourTest <SignalingPeers>(); test.component.AddStream(0, stream); yield return(test); foreach (var receiver in test.component.GetPeerReceivers(1)) { Assert.That(receiver.Streams, Has.Count.EqualTo(1)); } test.component.Dispose(); foreach (var track in stream.GetTracks()) { track.Dispose(); } stream.Dispose(); Object.DestroyImmediate(test.gameObject); }
/// <summary> /// Closes a peer connection. /// </summary> private void ClosePeerConnection() { lock (MediaLock) { if (_peerConnection != null) { _peerId = -1; if (_mediaStream != null) { foreach (var track in _mediaStream.GetTracks()) { track.Stop(); _mediaStream.RemoveTrack(track); } } _mediaStream = null; OnPeerConnectionClosed?.Invoke(); _peerConnection.Close(); // Slow, so do this after UI updated and camera turned off SessionId = null; #if ORTCLIB OrtcStatsManager.Instance.CallEnded(); #endif _peerConnection = null; OnReadyToConnect?.Invoke(); GC.Collect(); // Ensure all references are truly dropped. } } }
public IEnumerator TransceiverReturnsSender() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; MediaStream stream1 = Audio.CaptureStream(); peer1.AddTrack(stream1.GetTracks().First()); yield return(SignalingOffer(peer1, peer2)); Assert.That(peer2.GetTransceivers().Count(), Is.EqualTo(1)); RTCRtpSender sender1 = peer2.GetTransceivers().First().Sender; Assert.That(sender1, Is.Not.Null); MediaStream stream2 = Audio.CaptureStream(); RTCRtpSender sender2 = peer2.AddTrack(stream2.GetTracks().First()); Assert.That(sender2, Is.Not.Null); Assert.That(sender1, Is.EqualTo(sender2)); peer1.Dispose(); peer2.Dispose(); }
public IEnumerator MediaStreamTrackThrowExceptionAfterPeerDisposed() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; MediaStreamTrack track = null; MediaStream stream = Audio.CaptureStream(); peer1.AddTrack(stream.GetTracks().First()); peer2.OnTrack = e => { track = e.Track; }; yield return(SignalingOffer(peer1, peer2)); Assert.That(track, Is.Not.Null); peer2.Dispose(); Assert.That(() => track.Id, Throws.TypeOf <InvalidOperationException>()); track.Dispose(); }
private void AddTracks() { foreach (var track in videoStream.GetTracks()) { pc1Senders.Add(_pc1.AddTrack(track, videoStream)); } if (WebRTCSettings.UseVideoCodec != null) { var codecs = new[] { WebRTCSettings.UseVideoCodec }; foreach (var transceiver in _pc1.GetTransceivers()) { if (pc1Senders.Contains(transceiver.Sender)) { transceiver.SetCodecPreferences(codecs); } } } if (!videoUpdateStarted) { StartCoroutine(WebRTC.Update()); StartCoroutine(LoopStatsCoroutine()); videoUpdateStarted = true; } bandwidthSelector.interactable = false; scaleResolutionDownSelector.interactable = false; }
public IEnumerator ReceiverGetStreams() { var audioTrack = new AudioStreamTrack("audio"); var stream = new MediaStream(WebRTC.Context.CreateMediaStream("audiostream")); stream.AddTrack(audioTrack); yield return(0); var test = new MonoBehaviourTest <SignalingPeers>(); test.component.SetStream(stream); yield return(test); foreach (var receiver in test.component.GetReceivers(1)) { Assert.That(receiver.Streams, Has.Count.EqualTo(1)); } test.component.Dispose(); foreach (var track in stream.GetTracks()) { track.Dispose(); } stream.Dispose(); }
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)); } }
private void AddTracks() { foreach (var track in videoStream.GetTracks()) { pc1Senders.Add(_pc1.AddTrack(track, videoStream)); } if (!videoUpdateStarted) { StartCoroutine(WebRTC.Update()); videoUpdateStarted = true; } RTCRtpCodecCapability[] codecs = null; if (codecSelector.value == 0) { codecs = RTCRtpSender.GetCapabilities(TrackKind.Video).codecs; } else { RTCRtpCodecCapability preferredCodec = availableCodecs[codecSelector.value - 1]; codecs = new[] { preferredCodec }; } RTCRtpTransceiver transceiver = _pc1.GetTransceivers().First(); RTCErrorType error = transceiver.SetCodecPreferences(codecs); if (error != RTCErrorType.None) { Debug.LogErrorFormat("RTCRtpTransceiver.SetCodecPreferences failed. {0}", error); } }
private void Call() { Debug.Log("Starting calls"); pc1Local = new RTCPeerConnection(ref configuration); pc1Remote = new RTCPeerConnection(ref configuration); pc1Remote.OnTrack = e => receiveVideoStream1.AddTrack(e.Track); pc1Local.OnIceCandidate = candidate => pc1Remote.AddIceCandidate(ref candidate); pc1Remote.OnIceCandidate = candidate => pc1Local.AddIceCandidate(ref candidate); Debug.Log("pc1: created local and remote peer connection object"); pc2Local = new RTCPeerConnection(ref configuration); pc2Remote = new RTCPeerConnection(ref configuration); pc2Remote.OnTrack = e => receiveVideoStream2.AddTrack(e.Track); pc2Local.OnIceCandidate = candidate => pc2Remote.AddIceCandidate(ref candidate); pc2Remote.OnIceCandidate = candidate => pc2Local.AddIceCandidate(ref candidate); Debug.Log("pc2: created local and remote peer connection object"); foreach (var track in sourceVideoStream.GetTracks()) { pc1Local.AddTrack(track, sourceVideoStream); pc2Local.AddTrack(track, sourceVideoStream); } Debug.Log("Adding local stream to pc1Local/pc2Local"); StartCoroutine(NegotiationPeer(pc1Local, pc1Remote)); StartCoroutine(NegotiationPeer(pc2Local, pc2Remote)); callButton.interactable = false; hangUpButton.interactable = true; }
public IEnumerator UnitySetUp() { WebRTC.WebRTC.Initialize(); RTCConfiguration config = default; RTCIceCandidate candidate_ = null; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { candidate_ = candidate; }; MediaStream stream = WebRTC.Audio.CaptureStream(); peer1.AddTrack(stream.GetTracks().First()); RTCOfferOptions offerOptions = new RTCOfferOptions(); var op1 = peer1.CreateOffer(ref offerOptions); yield return(op1); m_DescOffer = op1.Desc; var op2 = peer1.SetLocalDescription(ref m_DescOffer); yield return(op2); var op3 = peer2.SetRemoteDescription(ref m_DescOffer); yield return(op3); RTCAnswerOptions answerOptions = new RTCAnswerOptions(); var op4 = peer2.CreateAnswer(ref answerOptions); yield return(op4); m_DescAnswer = op4.Desc; var op5 = peer2.SetLocalDescription(ref m_DescAnswer); yield return(op5); var op6 = peer1.SetRemoteDescription(ref m_DescAnswer); yield return(op6); yield return(new WaitUntil(() => candidate_ != null)); m_candidate = candidate_; stream.Dispose(); peer1.Close(); peer2.Close(); m_Context = SynchronizationContext.Current; signaling1 = CreateSignaling(m_SignalingType, m_Context); signaling2 = CreateSignaling(m_SignalingType, m_Context); }
/// <summary> /// Closes a peer connection. /// </summary> //private async Task ClosePeerConnection() private void ClosePeerConnection() { lock (MediaLock) { if (_peerConnection != null) { _peerId = -1; if (_mediaStream != null) { foreach (var track in _mediaStream.GetTracks()) { // Check Track Status before action to avoid reference errors // CRASH condition previously on non-XAML usage if (track != null) { if (track.Enabled) { track.Stop(); } _mediaStream.RemoveTrack(track); } } } _mediaStream = null; // TODO: Cleanup DataChannel if (_peerSendDataChannel != null) { _peerSendDataChannel.Close(); _peerSendDataChannel = null; } if (_peerReceiveDataChannel != null) { _peerReceiveDataChannel.Close(); _peerReceiveDataChannel = null; } OnPeerConnectionClosed?.Invoke(); _peerConnection.Close(); // Slow, so do this after UI updated and camera turned off SessionId = null; #if ORTCLIB OrtcStatsManager.Instance.CallEnded(); #endif _peerConnection = null; OnReadyToConnect?.Invoke(); // TODO: handle GC //GC.Collect(); // Ensure all references are truly dropped. } } }
public void StopStream(MediaStream stream) { if (stream != null) { foreach (var track in stream.GetTracks()) { stream.RemoveTrack(track); track.Stop(); } } }
private void AddTracks() { foreach (var track in videoStream.GetTracks()) { pc1Senders.Add(_pc1.AddTrack(track, videoStream)); } if (!videoUpdateStarted) { StartCoroutine(WebRTC.Update()); videoUpdateStarted = true; } }
private void AddTracks() { foreach (var track in videoStream.GetTracks()) { pc1Senders.Add(_pc1.AddTrack(track, videoStream)); } if (!videoUpdateStarted) { StartCoroutine(WebRTC.Update()); videoUpdateStarted = true; } addTracksButton.interactable = false; removeTracksButton.interactable = true; }
private void AddTracks() { foreach (var track in videoStream.GetTracks()) { pc1Senders.Add(_pc1.AddTrack(track, videoStream)); } if (!videoUpdateStarted) { StartCoroutine(WebRTC.Update()); StartCoroutine(UpdateStats()); videoUpdateStarted = true; } bandwidthSelector.interactable = false; }
void AddTracks(string connectionId, RTCPeerConnection pc) { // ToDo: need webrtc package version 2.3 // foreach (var transceiver in pc.GetTransceivers() // .Where(x => x.Receiver.Track.Kind == TrackKind.Video) // .Select((x, index) => new {x, index}) // .Take(m_listVideoStreamTrack.Count)) // { // RTCRtpSender sender = transceiver.x.Sender; // VideoStreamTrack track = m_listVideoStreamTrack[transceiver.index]; // transceiver.x.Sender.ReplaceTrack(track); // transceiver.x.Direction = RTCRtpTransceiverDirection.SendOnly; // // if (!m_mapTrackAndSenderList.TryGetValue(track, out List<RTCRtpSender> list)) // { // list = new List<RTCRtpSender>(); // m_mapTrackAndSenderList.Add(track, list); // } // // list.Add(sender); // } foreach (var track in m_listVideoStreamTrack) { RTCRtpSender sender = pc.AddTrack(track); if (!m_mapTrackAndSenderList.TryGetValue(track, out List <RTCRtpSender> list)) { list = new List <RTCRtpSender>(); m_mapTrackAndSenderList.Add(track, list); } list.Add(sender); } foreach (var track in m_audioStream.GetTracks()) { RTCRtpSender sender = pc.AddTrack(track); if (!m_mapTrackAndSenderList.TryGetValue(track, out List <RTCRtpSender> list)) { list = new List <RTCRtpSender>(); m_mapTrackAndSenderList.Add(track, list); } list.Add(sender); } }
void setupPeer(string clientId) { pc = new RTCPeerConnection(ref conf); pc.OnIceCandidate = candidate => { Debug.Log($"onIceCandidate: candidate:{candidate.candidate}, sdpMid:{candidate.sdpMid}, sdpMLineIndex:{candidate.sdpMLineIndex}"); wsMessageHandler.SendIceCandidate(candidate.candidate, candidate.sdpMid, candidate.sdpMLineIndex, clientId); }; foreach (var track in videoStream.GetTracks()) { pc.AddTrack(track); } foreach (var track in audioStream.GetTracks()) { pc.AddTrack(track); } StartCoroutine(proccessOffer(clientId)); }
public IEnumerator RestartIceInvokeOnNegotiationNeeded() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; MediaStream stream = Audio.CaptureStream(); peer1.AddTrack(stream.GetTracks().First()); yield return(SignalingOffer(peer1, peer2)); bool isInvokeOnNegotiationNeeded1 = false; bool isInvokeOnNegotiationNeeded2 = false; peer1.OnNegotiationNeeded = () => isInvokeOnNegotiationNeeded1 = true; peer2.OnNegotiationNeeded = () => isInvokeOnNegotiationNeeded2 = true; peer1.RestartIce(); var op9 = new WaitUntilWithTimeout(() => isInvokeOnNegotiationNeeded1, 5000); yield return(op9); Assert.That(op9.IsCompleted, Is.True); peer2.RestartIce(); var op10 = new WaitUntilWithTimeout(() => isInvokeOnNegotiationNeeded2, 5000); yield return(op10); Assert.That(op10.IsCompleted, Is.True); stream.Dispose(); peer1.Close(); peer2.Close(); }
void setupPeer(WebSocket client) { pc = new RTCPeerConnection(ref conf); pc.OnIceCandidate = candidate => { log.Print($"onIceCandidate"); var sm = new SignalingMessage(candidate.candidate, candidate.sdpMid, candidate.sdpMLineIndex); var msg = JsonUtility.ToJson(sm); ws.Send(msg); }; foreach (var track in videoStream.GetTracks()) { pc.AddTrack(track); } foreach (var track in audioStream.GetTracks()) { pc.AddTrack(track); } StartCoroutine(proccessOffer(client)); }
private void Call() { callButton.interactable = false; Debug.Log("GetSelectedSdpSemantics"); var configuration = GetSelectedSdpSemantics(); _pc1 = new RTCPeerConnection(ref configuration); Debug.Log("Created local peer connection object pc1"); _pc1.OnIceCandidate = pc1OnIceCandidate; _pc1.OnIceConnectionChange = pc1OnIceConnectionChange; _pc1.OnNegotiationNeeded = pc1OnNegotiationNeeded; _pc2 = new RTCPeerConnection(ref configuration); Debug.Log("Created remote peer connection object pc2"); _pc2.OnIceCandidate = pc2OnIceCandidate; _pc2.OnIceConnectionChange = pc2OnIceConnectionChange; _pc2.OnTrack = pc2Ontrack; videoStream = cam.CaptureStream(WebRTCSettings.StreamSize.x, WebRTCSettings.StreamSize.y); track = videoStream.GetTracks().First(); RtImage.texture = cam.targetTexture; }
private void Call() { Debug.Log("Starting calls"); pcLocal = new RTCPeerConnection(ref configuration); pcRemote = new RTCPeerConnection(ref configuration); pcRemote.OnTrack = e => receiveVideoStream.AddTrack(e.Track); pcLocal.OnIceCandidate = candidate => pcRemote.AddIceCandidate(candidate); pcRemote.OnIceCandidate = candidate => pcLocal.AddIceCandidate(candidate); Debug.Log("pc1: created local and remote peer connection object"); var senders = new List <RTCRtpSender>(); foreach (var track in sourceVideoStream.GetTracks()) { senders.Add(pcLocal.AddTrack(track, sourceVideoStream)); } if (WebRTCSettings.UseVideoCodec != null) { var codecs = new[] { WebRTCSettings.UseVideoCodec }; foreach (var transceiver in pcLocal.GetTransceivers()) { if (senders.Contains(transceiver.Sender)) { transceiver.SetCodecPreferences(codecs); } } } Debug.Log("Adding local stream to pcLocal"); callButton.interactable = false; createOfferButton.interactable = true; createAnswerButton.interactable = true; setOfferButton.interactable = true; setAnswerButton.interactable = true; hangUpButton.interactable = true; }
public IEnumerator AddAndRemoveTrack() { var camObj = new GameObject("Camera"); var cam = camObj.AddComponent <Camera>(); var stream1 = cam.CaptureStream(1280, 720); var stream2 = new MediaStream(); var test = new MonoBehaviourTest <SignalingPeers>(); test.component.AddStream(0, stream1); yield return(test); test.component.CoroutineUpdate(); yield return(new WaitUntil(() => test.component.NegotiationCompleted())); bool calledOnAddTrack = false; stream2.OnAddTrack = e => { Assert.That(e.Track, Is.Not.Null); calledOnAddTrack = true; }; var receivers = test.component.GetPeerReceivers(1); stream2.AddTrack(receivers.First().Track); yield return(new WaitUntil(() => calledOnAddTrack)); var tracks = stream2.GetTracks().ToArray(); foreach (var track in tracks) { stream2.RemoveTrack(track); track.Dispose(); } Object.DestroyImmediate(camObj); Object.DestroyImmediate(test.gameObject); yield return(new WaitForSeconds(0.1f)); }
IEnumerator Start() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; peers[0] = new RTCPeerConnection(ref config); peers[1] = new RTCPeerConnection(ref config); dataChannels[peers[0]] = new List <RTCDataChannel>(); dataChannels[peers[1]] = new List <RTCDataChannel>(); RTCDataChannel channel = peers[0].CreateDataChannel("data"); dataChannels[peers[0]].Add(channel); peers[0].OnIceCandidate = candidate => { Assert.NotNull(candidate); Assert.NotNull(candidate.Candidate); peers[1].AddIceCandidate(candidate); }; peers[1].OnIceCandidate = candidate => { Assert.NotNull(candidate); Assert.NotNull(candidate.Candidate); peers[0].AddIceCandidate(candidate); }; peers[1].OnTrack = e => { Assert.NotNull(e); Assert.NotNull(e.Track); Assert.NotNull(e.Receiver); Assert.NotNull(e.Transceiver); peers[1].AddTrack(e.Track); }; peers[0].OnDataChannel = e => { if (peers[0].ConnectionState == RTCPeerConnectionState.Connected) { dataChannels[peers[0]].Add(e); } }; peers[1].OnDataChannel = e => { if (peers[1].ConnectionState == RTCPeerConnectionState.Connected) { dataChannels[peers[1]].Add(e); } }; if (m_stream != null) { foreach (var track in m_stream.GetTracks()) { peers[0].AddTrack(track, m_stream); } } RTCOfferOptions options1 = default; RTCAnswerOptions options2 = default; var op1 = peers[0].CreateOffer(ref options1); yield return(op1); Assert.False(op1.IsError); var desc = op1.Desc; var op2 = peers[0].SetLocalDescription(ref desc); yield return(op2); Assert.False(op2.IsError); desc.sdp = ReplaceOfferSdpForHardwareEncodeTest(desc.sdp); var op3 = peers[1].SetRemoteDescription(ref desc); yield return(op3); Assert.False(op3.IsError); var op4 = peers[1].CreateAnswer(ref options2); yield return(op4); Assert.False(op4.IsError); desc = op4.Desc; var op5 = peers[1].SetLocalDescription(ref desc); yield return(op5); Assert.False(op5.IsError); desc.sdp = ReplaceAnswerSdpForHardwareEncodeTest(desc.sdp); var op6 = peers[0].SetRemoteDescription(ref desc); yield return(op6); Assert.False(op6.IsError); var op7 = new WaitUntilWithTimeout(() => peers[0].IceConnectionState == RTCIceConnectionState.Connected || peers[0].IceConnectionState == RTCIceConnectionState.Completed, 5000); yield return(op7); Assert.True(op7.IsCompleted); var op8 = new WaitUntilWithTimeout(() => peers[1].IceConnectionState == RTCIceConnectionState.Connected || peers[1].IceConnectionState == RTCIceConnectionState.Completed, 5000); yield return(op8); Assert.True(op8.IsCompleted); if (m_stream != null) { var op9 = new WaitUntilWithTimeout(() => GetPeerSenders(0).Any(), 5000); yield return(op9); Assert.True(op9.IsCompleted); } IsTestFinished = true; }
private void Call() { Debug.Log("Starting calls"); pc1Local = new RTCPeerConnection(ref configuration); pc1Remote = new RTCPeerConnection(ref configuration); pc1Remote.OnTrack = e => { if (e.Track is VideoStreamTrack videoTrack) { videoTrack.OnVideoReceived += tex => { receiveImage1.texture = tex; }; } if (e.Track is AudioStreamTrack audioTrack) { receiveAudio1.SetTrack(audioTrack); receiveAudio1.loop = true; receiveAudio1.Play(); } }; pc1Local.OnIceCandidate = candidate => pc1Remote.AddIceCandidate(candidate); pc1Remote.OnIceCandidate = candidate => pc1Local.AddIceCandidate(candidate); Debug.Log("pc1: created local and remote peer connection object"); pc2Local = new RTCPeerConnection(ref configuration); pc2Remote = new RTCPeerConnection(ref configuration); pc2Remote.OnTrack = e => { if (e.Track is VideoStreamTrack videoTrack) { videoTrack.OnVideoReceived += tex => { receiveImage2.texture = tex; }; } if (e.Track is AudioStreamTrack audioTrack) { receiveAudio2.SetTrack(audioTrack); receiveAudio2.loop = true; receiveAudio2.Play(); } }; pc2Local.OnIceCandidate = candidate => pc2Remote.AddIceCandidate(candidate); pc2Remote.OnIceCandidate = candidate => pc2Local.AddIceCandidate(candidate); Debug.Log("pc2: created local and remote peer connection object"); var pc1VideoSenders = new List <RTCRtpSender>(); var pc2VideoSenders = new List <RTCRtpSender>(); foreach (var track in sourceStream.GetTracks()) { var pc1Sender = pc1Local.AddTrack(track, sourceStream); var pc2Sender = pc2Local.AddTrack(track, sourceStream); if (track.Kind == TrackKind.Video) { pc1VideoSenders.Add(pc1Sender); pc2VideoSenders.Add(pc2Sender); } } if (WebRTCSettings.UseVideoCodec != null) { var codecs = new[] { WebRTCSettings.UseVideoCodec }; foreach (var transceiver in pc1Local.GetTransceivers()) { if (pc1VideoSenders.Contains(transceiver.Sender)) { transceiver.SetCodecPreferences(codecs); } } foreach (var transceiver in pc2Local.GetTransceivers()) { if (pc2VideoSenders.Contains(transceiver.Sender)) { transceiver.SetCodecPreferences(codecs); } } } Debug.Log("Adding local stream to pc1Local/pc2Local"); StartCoroutine(NegotiationPeer(pc1Local, pc1Remote)); StartCoroutine(NegotiationPeer(pc2Local, pc2Remote)); callButton.interactable = false; hangUpButton.interactable = true; }