コード例 #1
0
        public IEnumerator VideoStreamAddTrackAndRemoveTrack()
        {
            var width  = 256;
            var height = 256;
            var format = WebRTC.GetSupportedRenderTextureFormat(UnityEngine.SystemInfo.graphicsDeviceType);
            var rt     = new UnityEngine.RenderTexture(width, height, 0, format);

            rt.Create();
            var stream = new MediaStream();
            var track  = new VideoStreamTrack("video", rt);

            // wait for the end of the initialization for encoder on the render thread.
            yield return(0);

            Assert.That(track.Kind, Is.EqualTo(TrackKind.Video));
            Assert.That(stream.GetVideoTracks(), Has.Count.EqualTo(0));
            Assert.That(stream.AddTrack(track), Is.True);
            Assert.That(stream.GetVideoTracks(), Has.Count.EqualTo(1));
            Assert.That(stream.GetVideoTracks(), Has.All.Not.Null);
            Assert.That(stream.RemoveTrack(track), Is.True);
            Assert.That(stream.GetVideoTracks(), Has.Count.EqualTo(0));
            track.Dispose();
            // wait for disposing video track.
            yield return(0);

            stream.Dispose();
            Object.DestroyImmediate(rt);
        }
コード例 #2
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.
                }
            }
        }
コード例 #3
0
        public IEnumerator MediaStreamAddTrack()
        {
            var width  = 256;
            var height = 256;
            var format = WebRTC.GetSupportedRenderTextureFormat(UnityEngine.SystemInfo.graphicsDeviceType);
            var rt     = new UnityEngine.RenderTexture(width, height, 0, format);

            rt.Create();
            var stream = new MediaStream();
            var track  = new VideoStreamTrack("video", rt);

            yield return(new WaitForSeconds(0.1f));

            Assert.AreEqual(TrackKind.Video, track.Kind);
            Assert.AreEqual(0, stream.GetVideoTracks().Count());
            Assert.True(stream.AddTrack(track));
            Assert.AreEqual(1, stream.GetVideoTracks().Count());
            Assert.NotNull(stream.GetVideoTracks().First());
            Assert.True(stream.RemoveTrack(track));
            Assert.AreEqual(0, stream.GetVideoTracks().Count());
            track.Dispose();
            yield return(new WaitForSeconds(0.1f));

            stream.Dispose();
            Object.DestroyImmediate(rt);
        }
コード例 #4
0
        public void RemoveTrack(string connectionId, MediaStreamTrack track)
        {
            if (!string.IsNullOrEmpty(this.connectionId) && connectionId != this.connectionId)
            {
                return;
            }

            m_receiveStream.RemoveTrack(track);
        }
コード例 #5
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.
                }
            }
        }
コード例 #6
0
ファイル: CallContext.cs プロジェクト: yueyz818/ChatterBox
 public void StopStream(MediaStream stream)
 {
     if (stream != null)
     {
         foreach (var track in stream.GetTracks())
         {
             stream.RemoveTrack(track);
             track.Stop();
         }
     }
 }
コード例 #7
0
        public IEnumerator VideoStreamAddTrackAndRemoveTrack()
        {
            var width  = 256;
            var height = 256;
            var format = WebRTC.GetSupportedRenderTextureFormat(UnityEngine.SystemInfo.graphicsDeviceType);
            var rt     = new UnityEngine.RenderTexture(width, height, 0, format);

            rt.Create();
            var stream = new MediaStream();
            var track  = new VideoStreamTrack(rt);

            bool isCalledOnAddTrack    = false;
            bool isCalledOnRemoveTrack = false;

            stream.OnAddTrack = e =>
            {
                Assert.That(e.Track, Is.EqualTo(track));
                isCalledOnAddTrack = true;
            };
            stream.OnRemoveTrack = e =>
            {
                Assert.That(e.Track, Is.EqualTo(track));
                isCalledOnRemoveTrack = true;
            };

            // wait for the end of the initialization for encoder on the render thread.
            yield return(0);

            Assert.That(track.Kind, Is.EqualTo(TrackKind.Video));
            Assert.That(stream.GetVideoTracks(), Has.Count.EqualTo(0));
            Assert.That(stream.AddTrack(track), Is.True);
            Assert.That(stream.GetVideoTracks(), Has.Count.EqualTo(1));
            Assert.That(stream.GetVideoTracks(), Has.All.Not.Null);
            Assert.That(stream.RemoveTrack(track), Is.True);
            Assert.That(stream.GetVideoTracks(), Has.Count.EqualTo(0));

            var op1 = new WaitUntilWithTimeout(() => isCalledOnAddTrack, 5000);

            yield return(op1);

            var op2 = new WaitUntilWithTimeout(() => isCalledOnRemoveTrack, 5000);

            yield return(op2);

            track.Dispose();

            stream.Dispose();
            Object.DestroyImmediate(rt);
        }
コード例 #8
0
        public void AddAndRemoveAudioStreamTrack()
        {
            var stream = new MediaStream();
            var track  = new AudioStreamTrack("audio");

            Assert.AreEqual(TrackKind.Audio, track.Kind);
            Assert.AreEqual(0, stream.GetAudioTracks().Count());
            Assert.True(stream.AddTrack(track));
            Assert.AreEqual(1, stream.GetAudioTracks().Count());
            Assert.NotNull(stream.GetAudioTracks().First());
            Assert.True(stream.RemoveTrack(track));
            Assert.AreEqual(0, stream.GetAudioTracks().Count());
            track.Dispose();
            stream.Dispose();
        }
コード例 #9
0
        public void AddAndRemoveAudioStreamTrack()
        {
            var stream = new MediaStream();
            var track  = new AudioStreamTrack("audio");

            Assert.That(TrackKind.Audio, Is.EqualTo(track.Kind));
            Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(0));
            Assert.That(stream.AddTrack(track), Is.True);
            Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(1));
            Assert.That(stream.GetAudioTracks(), Has.All.Not.Null);
            Assert.That(stream.RemoveTrack(track), Is.True);
            Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(0));
            track.Dispose();
            stream.Dispose();
        }
コード例 #10
0
    private void DeleteTracks()
    {
        MediaStreamTrack[] senderTracks = sendStream.GetTracks().ToArray();
        foreach (var track in senderTracks)
        {
            sendStream.RemoveTrack(track);
            track.Dispose();
        }

        MediaStreamTrack[] receiveTracks = receiveStream.GetTracks().ToArray();
        foreach (var track in receiveTracks)
        {
            receiveStream.RemoveTrack(track);
            track.Dispose();
        }
    }
コード例 #11
0
        public void AddAndRemoveAudioTrack()
        {
            var obj    = new GameObject("audio");
            var source = obj.AddComponent <AudioSource>();

            source.clip = AudioClip.Create("test", 480, 2, 48000, false);
            var stream = new MediaStream();
            var track  = new AudioStreamTrack(source);

            Assert.That(TrackKind.Audio, Is.EqualTo(track.Kind));
            Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(0));
            Assert.That(stream.AddTrack(track), Is.True);
            Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(1));
            Assert.That(stream.GetAudioTracks(), Has.All.Not.Null);
            Assert.That(stream.RemoveTrack(track), Is.True);
            Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(0));
            track.Dispose();
            stream.Dispose();
            Object.DestroyImmediate(source.clip);
            Object.DestroyImmediate(obj);
        }
コード例 #12
0
        public void AddAndRemoveAudioStreamTrack()
        {
            GameObject  obj    = new GameObject("audio");
            AudioSource source = obj.AddComponent <AudioSource>();

            source.clip = AudioClip.Create("test", 480, 2, 48000, false);
            var stream = new MediaStream();
            var track  = new AudioStreamTrack(source);

            Assert.AreEqual(TrackKind.Audio, track.Kind);
            Assert.AreEqual(0, stream.GetAudioTracks().Count());
            Assert.True(stream.AddTrack(track));
            Assert.AreEqual(1, stream.GetAudioTracks().Count());
            Assert.NotNull(stream.GetAudioTracks().First());
            Assert.True(stream.RemoveTrack(track));
            Assert.AreEqual(0, stream.GetAudioTracks().Count());
            track.Dispose();
            stream.Dispose();
            Object.DestroyImmediate(source.clip);
            Object.DestroyImmediate(obj);
        }
コード例 #13
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));
        }
コード例 #14
0
 public void RemoveTrack(IAudioTrack audioTrack)
 {
     _mediaStream.RemoveTrack(audioTrack.ToNative <AudioTrack>());
 }