/// <summary> /// 暂停播放 /// </summary> /// <param name="index"></param> private void Pause(int index) { Border border = GridHelpers.GetBorderByTag(this.gridVideo.Children, index); CameraPanelItem item = border.DataContext as CameraPanelItem; item.GetPlayView().Pause(); }
/// <summary> /// 给对应 Border 放置监控,查看是否已有,有就停止 /// </summary> /// <param name="border"></param> /// <param name="panelItem"></param> public static void SetCameraOnBorder(Border border, CameraPanelItem panelItem) { if (border.DataContext is CameraPanelItem oldItem) { oldItem.GetPlayView().Stop(); border.DataContext = null; border.Child = null; } var channel = panelItem.GetPlayView(); border.DataContext = panelItem; var winFormHost = new WindowsFormsHost(); var playPanle = new System.Windows.Forms.Panel(); winFormHost.Child = playPanle; border.Background = Brushes.Gray; border.Child = winFormHost; playPanle.Controls.Clear(); channel.OnPlayError += (s, e) => { var log = NLog.LogManager.GetCurrentClassLogger(); log.Error(e.ErrorMessage + e.Code); }; if (channel.Playing) { channel.Stop(); } channel.Play(winFormHost.Child); }
CameraPanelItem singleOldItem = null; //全屏播放的视频信息 /// <summary> /// 双击全屏播放视频 /// </summary> /// <param name="index">视频索引</param> private void SetSingle(int index) { if (!isSinglePlay) { var rows = this.gridVideo.RowDefinitions.Count; var cols = this.gridVideo.ColumnDefinitions.Count; foreach (UIElement item in this.gridVideo.Children) { item.Visibility = Visibility.Hidden; } singleBorder = GridHelpers.GetBorderByTag(this.gridVideo.Children, index); singleBorder.Visibility = Visibility.Visible; singleRowSpan = (int)singleBorder.GetValue(Grid.RowSpanProperty); singleRow = (int)singleBorder.GetValue(Grid.RowProperty); singleColsSpan = (int)singleBorder.GetValue(Grid.ColumnSpanProperty); singleCol = (int)singleBorder.GetValue(Grid.ColumnProperty); // 视频源全部换为主码流 singleOldItem = singleBorder.DataContext as CameraPanelItem; CameraPanelItem newItem = singleOldItem.Clone() as CameraPanelItem; if (newItem.PlayType == PlayContentType.One && newItem.Camera.StreamType == 1) { singleOldItem.GetPlayView().Stop(); newItem.Camera.StreamType = 0; changeStream = true; } if (newItem.PlayType == PlayContentType.Group) { for (int i = 0; i < newItem.CameraGroup.Items.Count; i++) { if (newItem.CameraGroup.Items[i].StreamType == 1) { singleOldItem.GetPlayView().Stop(); newItem.CameraGroup.Items[i].StreamType = 0; changeStream = true; } } } if (changeStream) { GridHelpers.SetCameraOnBorder(singleBorder, newItem); } singleBorder.SetValue(Grid.RowProperty, 0); singleBorder.SetValue(Grid.ColumnProperty, 0); singleBorder.SetValue(Grid.ColumnSpanProperty, cols); singleBorder.SetValue(Grid.RowSpanProperty, rows); isSinglePlay = true; } }
/// <summary> /// 播放视频流等 /// </summary> /// <param name="border"></param> /// <param name="panelItem"></param> public static void SetBorderChildByVLC(Border border, CameraPanelItem panelItem) { if (border.DataContext is CameraPanelItem oldItem) { border.DataContext = null; border.Child = null; } border.DataContext = panelItem; if (UseWPFControl) { Vlc.DotNet.Wpf.VlcControl vlcControl = new Vlc.DotNet.Wpf.VlcControl(); vlcControl.SourceProvider.CreatePlayer(libDirectory); if (panelItem.RtspStrs.Count > 1) { VLCGroup vlcGroup = new VLCGroup(1, 15); vlcGroup.PlayOnWPF(vlcControl, panelItem.RtspStrs); } else { vlcControl.SourceProvider.MediaPlayer.Play(new Uri(panelItem.RtspStrs[0])); } border.Child = vlcControl; } else { VlcControl vlcControl = new VlcControl(); string ratio = border.ActualWidth + ":" + border.ActualHeight; vlcControl.BeginInit(); vlcControl.VlcLibDirectory = libDirectory; vlcControl.EndInit(); WindowsFormsHost windowsFormsHost = new WindowsFormsHost { Child = vlcControl }; border.Child = windowsFormsHost; vlcControl.Video.FullScreen = true; vlcControl.Video.AspectRatio = ratio; if (panelItem.RtspStrs.Count > 1) { VLCGroup vlcGroup = new VLCGroup(1, 15); vlcGroup.Play(vlcControl, panelItem.RtspStrs); } else { vlcControl.Play(new Uri(panelItem.RtspStrs[0])); } } }
bool changeStream = false; // 是否需要更改码流 /// <summary> /// 双击全屏播放视频 /// </summary> /// <param name="index">视频索引</param> private void SetSingle(int index) { if (!isSinglePlay) { var rows = this.gridVideo.RowDefinitions.Count; var cols = this.gridVideo.ColumnDefinitions.Count; foreach (UIElement item in this.gridVideo.Children) { item.Visibility = Visibility.Hidden; } newBorder = GridHelpers.CreateBorder(); newBorder.Visibility = Visibility.Visible; Border singleBorder = GridHelpers.GetBorderByTag(this.gridVideo.Children, index); // 视频源全部换为主码流 CameraPanelItem singleOldItem = singleBorder.DataContext as CameraPanelItem; CameraPanelItem newItem = singleOldItem.Clone() as CameraPanelItem; if (newItem.PlayType == PlayContentType.One && newItem.Camera.StreamType == 1) { newItem.RtspStrs[0] = newItem.RtspStrs[0].Replace("/sub/", "/main/"); newItem.Camera.StreamType = 0; changeStream = true; } if (newItem.PlayType == PlayContentType.Group) { for (int i = 0; i < newItem.CameraGroup.Items.Count; i++) { if (newItem.CameraGroup.Items[i].StreamType == 1) { newItem.RtspStrs[i] = newItem.RtspStrs[i].Replace("/sub/", "/main/"); newItem.CameraGroup.Items[i].StreamType = 0; changeStream = true; } } } newBorder.SetValue(Grid.RowProperty, 0); newBorder.SetValue(Grid.ColumnProperty, 0); newBorder.SetValue(Grid.ColumnSpanProperty, cols); newBorder.SetValue(Grid.RowSpanProperty, rows); this.gridVideo.Children.Add(newBorder); if (changeStream) { GridHelpers.SetBorderChildByVLC(newBorder, newItem); } isSinglePlay = true; } }
/// <summary> /// 播放命令操作 /// </summary> /// <param name="tvConfig"></param> public void PlayOnTV(TvConfig tvConfig) { // 处理数据对象,转换为封装的 Camera 等对象 CameraPanel cameraPanel = new CameraPanel { LayoutInfo = tvConfig.LayoutInfo }; if (tvConfig.MonitorInfo != null) { List <int> indexs = tvConfig.MonitorInfo.Select(t => t.Index).Distinct().ToList(); foreach (int index in indexs) { List <MonitorInfo> monitors = tvConfig.MonitorInfo.Where(t => t.Index == index).ToList(); CameraPanelItem panelItem = new CameraPanelItem { Index = index, RtspStrs = new List <string>(), RtmpStrs = new List <string>() }; if (monitors.Count > 1) { CameraGroup cameraGroup = new CameraGroup { Interval = monitors[0].TimeInterval }; foreach (var monitor in monitors) { DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera { StreamType = monitor.StreamType, DVR = dvr, Number = monitor.Channel }; cameraGroup.Items.Add(camera); panelItem.RtspStrs.Add(monitor.Rtsp); panelItem.RtmpStrs.Add(monitor.Rtmp); } panelItem.CameraGroup = cameraGroup; panelItem.Flag = monitors[0].Flag; panelItem.PlayType = PlayContentType.Group; } else { MonitorInfo monitor = monitors[0]; DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera() { DVR = dvr, StreamType = monitor.StreamType, Number = monitor.Channel }; panelItem.RtspStrs.Add(monitor.Rtsp); panelItem.RtmpStrs.Add(monitor.Rtmp); panelItem.Camera = camera; panelItem.Flag = monitor.Flag; panelItem.PlayType = PlayContentType.One; } cameraPanel.Cameras.Add(panelItem); } } gridVideo.SetValue(GridHelpers.CamearPanelProperty, cameraPanel); }
/// <summary> /// 播放命令操作 /// </summary> /// <param name="tvConfig"></param> public void PlayOnTV(TvConfig tvConfig) { // 当布局变化时视频信息会变,清楚全部的 CameraPanelItem 信息 if (tvConfig.LayoutInfo != null) { this.cameras = new Dictionary <int, CameraPanelItem>(); } // 处理数据对象,转换为封装的 Camera 等对象 CameraPanel cameraPanel = new CameraPanel { LayoutInfo = tvConfig.LayoutInfo }; if (tvConfig.MonitorInfo != null) { List <int> indexs = tvConfig.MonitorInfo.Select(t => t.Index).Distinct().ToList(); foreach (int index in indexs) { List <MonitorInfo> monitors = tvConfig.MonitorInfo.Where(t => t.Index == index).ToList(); CameraPanelItem panelItem = new CameraPanelItem { Index = index }; if (monitors.Count > 1) { CameraGroup cameraGroup = new CameraGroup { Interval = monitors[0].TimeInterval }; foreach (var monitor in monitors) { DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera { StreamType = monitor.StreamType, DVR = dvr, Number = monitor.Channel }; cameraGroup.Items.Add(camera); } panelItem.CameraGroup = cameraGroup; panelItem.Flag = monitors[0].Flag; panelItem.PlayType = PlayContentType.Group; } else { MonitorInfo monitor = monitors[0]; DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera() { DVR = dvr, StreamType = monitor.StreamType, Number = monitor.Channel }; panelItem.Camera = camera; panelItem.Flag = monitor.Flag; panelItem.PlayType = PlayContentType.One; if (monitor.Ip == null && monitor.User == null) { panelItem.Flag = 0; } } cameraPanel.Cameras.Add(panelItem); if (this.cameras.ContainsKey(index)) { this.cameras.Remove(index); } this.cameras.Add(index, panelItem); } // 登录各个设备,为后面播放, // 这里再返回赋值,因为每次都需要登录信息,否则失败 foreach (var item2 in cameraPanel.Cameras) { if (item2.Camera != null) { item2.Camera.DVR.Connection(false); } else if (item2.CameraGroup != null) { foreach (var item in item2.CameraGroup.Items) { item.DVR.Connection(false); } } } } this.gridVideo.SetValue(GridHelpers.CamearPanelProperty, cameraPanel); }