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); }
/// <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 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); }
public void RemoveTrack(string connectionId, MediaStreamTrack track) { if (!string.IsNullOrEmpty(this.connectionId) && connectionId != this.connectionId) { return; } m_receiveStream.RemoveTrack(track); }
/// <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(); } } }
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); }
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(); }
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(); }
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(); } }
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); }
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); }
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)); }
public void RemoveTrack(IAudioTrack audioTrack) { _mediaStream.RemoveTrack(audioTrack.ToNative <AudioTrack>()); }