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);
                }
            }
        }
    }
Exemple #2
0
 private void AddTracks()
 {
     foreach (var track in sendStream.GetTracks())
     {
         _pc1.AddTrack(track, sendStream);
     }
 }
Exemple #3
0
        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);
     }
 }
Exemple #5
0
    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;
    }
Exemple #7
0
        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);
        }
Exemple #8
0
        /// <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.
                }
            }
        }
Exemple #9
0
        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();
        }
Exemple #10
0
        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;
    }
Exemple #12
0
        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));
            }
        }
Exemple #14
0
    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;
    }
Exemple #16
0
        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);
        }
Exemple #17
0
        /// <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.
                }
            }
        }
Exemple #18
0
 public void StopStream(MediaStream stream)
 {
     if (stream != null)
     {
         foreach (var track in stream.GetTracks())
         {
             stream.RemoveTrack(track);
             track.Stop();
         }
     }
 }
Exemple #19
0
    private void AddTracks()
    {
        foreach (var track in videoStream.GetTracks())
        {
            pc1Senders.Add(_pc1.AddTrack(track, videoStream));
        }

        if (!videoUpdateStarted)
        {
            StartCoroutine(WebRTC.Update());
            videoUpdateStarted = true;
        }
    }
Exemple #20
0
 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;
    }
Exemple #22
0
        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);
            }
        }
Exemple #23
0
 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));
 }
Exemple #24
0
        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));
 }
Exemple #26
0
        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;
        }
Exemple #27
0
    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;
    }
Exemple #28
0
        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;
        }