public async Task PlayVideo(Uri uri) { if (await _sessionSetupLock.WaitAsync(0) == false) { return; } Debug.WriteLine("VideoPlayerViewModel::PlayVideo()"); try { if (_rtspHandler != null || _mediaSource != null) { await StopVideoCore(); } _rtspHandler = new RtspHandler(uri); _rtspHandler.Connect(); _mediaSource = new RtspMediaSource(); var videoConfig = new RtspMediaSource.StreamConfig() { SourceStream = _rtspHandler.VideoStream, ParameterString = _rtspHandler.VideoParameter, FixedFrameRate = new Ratio(Configuration.VideoFrameRate, 1) }; var audioConfig = new RtspMediaSource.StreamConfig() { SourceStream = _rtspHandler.AudioStream, ParameterString = _rtspHandler.AudioParameter }; _mediaSource.Open(videoConfig, audioConfig); _session.Load(_mediaSource); _rtspHandler.Play(); // Wait PlayStarted to be true await _rtspHandler.PlayStarted.Where(b => b).Timeout(OperationTimeoutSpan).Take(1); _session.Play(); // Wait IsPlaying to be true or PlayFailed var playresult = await _session.IsSessionReadyChanged.Where(b => b).Select(b => 0).Merge(_session.PlayFailed).Timeout(OperationTimeoutSpan).Take(1); if (playresult != 0) { Debug.WriteLine($"VideoPlayerViewModel::PlayVideo() Play Failed. Code=0x{playresult:X8}"); IsEnabled = false; await StopVideoCore(); } } catch (Exception ex) { Debug.WriteLine($"VideoPlayerViewModel::PlayVideo() Exception '{ex.Message}'"); IsEnabled = false; } finally { _sessionSetupLock.Release(); } }
public VideoPlayerModel() { _rtspHandler = null; _mediaSource = null; _sessionSetupLock = new SemaphoreSlim(1, 1); _session = new HwndRenderSession(); _session.IsSessionReadyChanged.Where(b => b).Subscribe(_ => { SetVideoSize(_videoHostPosition); _session.Volume = _volume; _session.IsMuted = _isMuted; }); IsEnabled = true; _videoHostPosition = Int32Rect.Empty; _volume = 1.0f; _isMuted = false; }
private async Task StopVideoCore() { Debug.WriteLine("VideoPlayerViewModel::StopVideoCore()"); try { _session.Stop(); _session.Close(); // Wait IsSessionReady to be false await _session.IsSessionReadyChanged.Where(b => !b).Timeout(OperationTimeoutSpan).Take(1); _rtspHandler?.Disconnect(); _rtspHandler?.Dispose(); _mediaSource?.Shutdown(); _mediaSource?.Dispose(); } catch (Exception ex) { Debug.WriteLine($"VideoPlayerViewModel::StopVideoCore() Exception '{ex.Message}'"); } finally { _rtspHandler = null; _mediaSource = null; } }