Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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;
            }
        }