Example #1
0
        public IObservable <Unit> StopVideo()
        {
            return(Observable.Create <Unit>(observer =>
            {
                var request = new StopVideoRequest();
                var stopVideoResponse = _cameraServiceClient.StopVideo(request);
                var cameraResult = stopVideoResponse.CameraResult;
                if (cameraResult.Result == CameraResult.Types.Result.Success)
                {
                    observer.OnCompleted();
                }
                else
                {
                    observer.OnError(new CameraException(cameraResult.Result, cameraResult.ResultStr));
                }

                return Task.FromResult(Disposable.Empty);
            }));
        }
Example #2
0
        public VideoPanelView()
        {
            InitializeComponent();

            grid.Rows = 2;

            for (var r = 0; r < 2; r++)
            {
                for (var c = 0; c < 2; c++)
                {
                    var player = new VideoPlayerView
                    {
                        Margin = new Thickness(6)
                    };
                    //Grid.SetRow(player, r);
                    //Grid.SetColumn(player, c);
                    grid.Children.Add(player);
                    Players.Add(player);
                }
            }

            EventManager.RegisterClassHandler(typeof(VideoPlayerView), VideoPlayerView.MouseClickEvent, new RoutedEventHandler((
                                                                                                                                   (sender, args) =>
            {
                foreach (var screen in Players.Where(x => !Equals(x, args.OriginalSource)))
                {
                    screen.HideBorder();
                }
            })));
            EventManager.RegisterClassHandler(typeof(VideoPlayerView), VideoPlayerView.FullScreenClickEvent, new RoutedEventHandler((
                                                                                                                                        (sender, args) =>
            {
                grid.Rows = 1;
                foreach (var screen in Players.Where(x => !Equals(x, args.OriginalSource)))
                {
                    screen.Visibility = Visibility.Collapsed;
                }
            })));
            EventManager.RegisterClassHandler(typeof(VideoPlayerView), VideoPlayerView.RestoreScreenClickEvent, new RoutedEventHandler((
                                                                                                                                           (sender, args) =>
            {
                grid.Rows = 2;
                foreach (var screen in Players)
                {
                    screen.Visibility = Visibility.Visible;
                }
            })));

            var loadOrUnload = Observable.FromEventPattern <RoutedEventArgs>(this, nameof(UserControl.Loaded))
                               .Select(_ => "loaded")
                               .Merge(Observable.FromEventPattern <RoutedEventArgs>(this, nameof(UserControl.Unloaded))
                                      .Select(_ => "unloaded"))
                               .Throttle(TimeSpan.FromMilliseconds(500))
                               .DistinctUntilChanged();

            loadOrUnload.ObserveOnDispatcher()
            .Skip(1)
            .Subscribe(value =>
            {
                Players.ForEach(x =>
                {
                    switch (value)
                    {
                    case "loaded":
                        x.Replay();
                        break;

                    case "unloaded":
                        x.Stop();
                        break;
                    }
                });
            }, ex => LogHelper.Error($"视频面板发生异常,{ex}"));


            _idsSubject.Switch()
            .SkipUntil(loadOrUnload.Where(x => x == "loaded"))
            .TakeUntil(loadOrUnload.Where(x => x == "unloaded"))
            .Repeat()
            .ObserveOnDispatcher()
            .Subscribe(async x =>
            {
                if (Responses?.Count > 0)
                {
                    var stopVideoRequest = new StopVideoRequest
                    {
                        PlayList = Responses.Select(y => new PlayListItem
                        {
                            Url       = y.Url,
                            CameraId  = y.CameraId,
                            SessionId = y.SessionId
                        }).ToList()
                    };
                    await ContainerLocator.Container.Resolve <IVideoService>()?.StopVideo(stopVideoRequest);
                    Responses = null;
                }


                if (x.Count == 0)
                {
                    Players.ForEach(player => player.Stop());
                    return;
                }
                var result = await ContainerLocator.Container.Resolve <IVideoService>()?.PlayVideo(x.ToArray());
                Responses  = result;
                for (var i = 0; i < Players.Count; i++)
                {
                    if (result.Count > i)
                    {
                        Players[i].Play(result[i].Url);
                    }
                    else
                    {
                        Players[i].Stop();
                    }
                }
            }, ex => LogHelper.Error($"视频面板发生异常,{ex}"));

            _subject.Throttle(TimeSpan.FromMilliseconds(500))
            .DistinctUntilChanged(x =>
            {
                var builder        = new StringBuilder();
                var(interval, ids) = x;
                builder.Append(interval);

                foreach (var id in ids)
                {
                    builder.Append(id);
                }

                //ids.ForEach(y => builder.Append(y));
                return(builder.ToString());
            })
            .Select(x =>
            {
                var(interval, ids) = x;
                var o = Observable.Interval(TimeSpan.FromSeconds(interval))
                        .Select(tick => tick + 1)
                        .StartWith(0)
                        .Select(tick =>
                {
                    if (ids.Length == 0)
                    {
                        return(new List <long>());
                    }

                    var start = (4 * tick) % ids.Length;
                    var end   = start + 4 > ids.Length ? ids.Length : start + 4;
                    var list  = new List <long>(4);

                    for (var i = start; i < end; i++)
                    {
                        list.Add(ids[i]);
                    }
                    return(list);
                });
                return(o);
            })
            .Subscribe(x =>
            {
                _idsSubject.OnNext(x);
            }, ex => LogHelper.Error($"视频面板发生异常,{ex}"));
        }
        public GlobalJsonResult <EmptyResult> Stop(int videoId, [FromBody] StopVideoRequest request)
        {
            videoPlayer.Stop();

            return(GlobalJsonResult <EmptyResult> .Success(HttpStatusCode.OK));
        }
Example #4
0
 public void StopVideo(int videoId, StopVideoRequest request)
 {
     this.Post <StopVideoRequest, EmptyResult>(string.Format("api/VideoPlayback/Stop?videoId={0}", videoId), request);
 }