You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

486 lines
15 KiB

using EC.Entity.Video;
using EC.Utils;
using EC.Utils.Config;
using ECMonitor.Code;
using ECMonitor.Manager;
using ECMonitor.UC.Videos;
using Prism.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace ECMonitor.Views
{
/// <summary>
/// FrmVideoWanging.xaml 的交互逻辑
/// </summary>
public partial class FrmVideoWanging : Window
{
VideoPlayManager _videoPlayManager { get; set; } = new VideoPlayManager();
double _videoWidth = 400;
double _videoHeight = 300;
/// <summary>
/// 正在播放的视频数量
/// </summary>
private int _playerNumber { get; set; } = 0;
/// <summary>
///当前窗体类型1,2(4),3(9),4(16)
/// </summary>
private int _playerRowNumber = 0;
/// <summary>
/// 播放器窗体数量
/// </summary>
private int _playerWindowsNumber = 0;
/// <summary>
/// 自动运行
/// </summary>
bool _running = true;
/// <summary>
/// 自动关闭窗体
/// </summary>
bool? _autoClose { get; set; } = true;
bool _formIsShow = false;
IEventAggregator _ea;
public FrmVideoWanging(IEventAggregator ea)
{
InitializeComponent();
_ea = ea;
_autoClose = ConfigHelper.AutoWarningClose();
chkAutoClose.IsChecked = _autoClose;
}
#region 系统设置
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ChangePlayerGridByRowNum(1);
RunAutoClosePlayerServer();
}
private void btnClose_Click(object sender, RoutedEventArgs e)
{
FormHide();
}
public void ShowAndActive()
{
if (_formIsShow == false)
{
this.Dispatcher.Invoke(new Action(() =>
{
this.Show();
this.Activate();
if (this.WindowState == WindowState.Minimized)
{
this.WindowState = WindowState.Normal;
}
}));
_formIsShow = true;
}
}
public void FormHide()
{
this.Dispatcher.Invoke(new Action(() =>
{
this.Hide();
}));
_formIsShow = false;
}
private void Window_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
this.DragMove();
}
}
#endregion
/// <summary>
/// 设置窗体每行播放器数量
/// </summary>
/// <param name="rowNumber"></param>
private void ChangePlayerGridByRowNum(int rowNumber = 1)
{
this.Dispatcher.Invoke(new Action(() =>
{
ChangePlayerGridByRowNumInvoke(rowNumber);
}));
}
private void ChangePlayerGridByRowNumInvoke(int rowNumber = 1)
{
if (_playerRowNumber == rowNumber)
{
return;
}
_playerRowNumber = rowNumber;
double width = 900;
double height = 645;
#region 计算窗体大小
double screenWidth = SystemParameters.PrimaryScreenWidth;//得到屏幕整体宽度
double screenHeight = SystemParameters.PrimaryScreenHeight;//得到屏幕整体高度
if (rowNumber < 4)
{
width = 900;
height = 645;
}
else
{
width = 1200;
height = 845;
}
this.Width = width;
this.Height = height;
this.Left = (screenWidth - width) / 2 - 10;
double top = (screenHeight - height) / 2 - 20;
if (top < 10) top = 10;
this.Top = top;
#endregion
//Padding =2,2,2,2
width = width - 4;
height = height - 4-45;
_videoWidth = width / rowNumber - 5;
_videoHeight = height / rowNumber - 5;
int showVideoNumber = rowNumber * rowNumber;
_playerWindowsNumber = showVideoNumber;
int addedVideoNumber = _videoPlayManager.GetUCVideoList().Count();
int dif = showVideoNumber - addedVideoNumber;
//已经添加的 多余界面
if (dif < 0)
{
//设置界面大小
for (int i = 0; i < showVideoNumber; i++)
{
var videoPlay = _videoPlayManager.GetUCVideoList()[i];
videoPlay.ReSetSize(_videoWidth, _videoHeight);
string ucname = videoPlay.GetName();
var rtspVideo = (UserControl)this.panMain.FindName(ucname);
if (rtspVideo == null)//如果没有添加的添加
{
this.panMain.Children.Add(videoPlay.GetControl());
this.panMain.RegisterName(videoPlay.GetName(), videoPlay.GetControl());
}
}
//从界面删除
for (int i = showVideoNumber; i < addedVideoNumber; i++)
{
var videoPlay = _videoPlayManager.GetUCVideoList()[i];
RemoveFromView(videoPlay.GetName());
}
}
else if (dif >= 0) ///已经添加的少于界面
{
//设置界面大小
for (int i = 0; i < addedVideoNumber; i++)
{
var videoPlay = _videoPlayManager.GetUCVideoList()[i];
videoPlay.ReSetSize(_videoWidth, _videoHeight);
string ucname = videoPlay.GetName();
var rtspVideo = (UserControl)this.panMain.FindName(ucname);
if (rtspVideo == null)
{
this.panMain.Children.Add(videoPlay.GetControl());
this.panMain.RegisterName(videoPlay.GetName(), videoPlay.GetControl());
}
}
//添加新的视频窗体
for (int i = 0; i < dif; i++)
{
var iUCVideo = _videoPlayManager.CreateWaringVideo(_ea,_videoWidth, _videoHeight,0,false);
var ucvideo = iUCVideo.GetControl();
ucvideo.Margin = new Thickness(2, 2, 2, 2);
this.panMain.Children.Add(ucvideo);
this.panMain.RegisterName(ucvideo.Name, ucvideo);
iUCVideo.PlayerMouseDown += PlayerMouseDown;
}
}
}
/// <summary>
/// 选中设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PlayerMouseDown(object sender, int videoIndex)
{
_videoPlayManager.SetALLUnSelected();
(sender as IUCPlayer).SetSelected(true);
}
private void Play(string ip, int playNumber)
{
try
{
int playerIndex = playNumber - 1;
var ucVideoList = _videoPlayManager.GetUCVideoList();
int icount = ucVideoList.Count();
if(icount< playNumber){
LogFactory.GetLogger().Debug("videoPlayManager.GetUCVideoList count ="+ icount);
return;
}
var videoPlay = ucVideoList[playerIndex];
if (videoPlay == null)
{
MessageManager.ShowMessage("当前选中的播放器 SelectIndex=" + playerIndex.ToString(), true);
return;
}
MonitorCamera camera = CameraManager.GetCamera(ip);
if (camera == null)
{
MessageManager.ShowMessage(ip + "相机没有在系统登记 临时创建 ", true);
camera = new MonitorCamera(ip, 8000, "admin", "hk123456");
}
bool play = videoPlay.Play(camera);
}catch(Exception ex)
{
LogFactory.GetLogger().Debug(ex.Message);
}
}
public void NewWarningPlay(string cameaIp)
{
lock (this)
{
int playNumber = 0;
List<IUCPlayer> playerList = _videoPlayManager.GetUCVideoList();
foreach (IUCPlayer player in playerList)
{
if (player.IsPlaying())
{
playNumber++;
if (player.GetCameraIp() == cameaIp)//发现已经在播放列表
{
player.UPDateTime();
ShowAndActive();
LogFactory.GetLogger().Debug("return ameaIp==" + cameaIp);
return;
}
}
}
playNumber++;
ChangePlayerGridByAllPlayerNumber(playNumber);
LogFactory.GetLogger().Debug(" Play--------cameaIp=" + cameaIp + ", playNumber="+ playNumber + " ");
Play(cameaIp, playNumber);
_playerNumber = playNumber;
if (playNumber > 0)
{
ShowAndActive();
}
}
}
/// <summary>
///通过播放器数量 修改播放排列表格
/// </summary>
/// <param name="playNumber"></param>
public void ChangePlayerGridByAllPlayerNumber(int playNumber)
{
if (playNumber <= _playerWindowsNumber)
{
return;
}
if (playNumber <= 1)
{
ChangePlayerGridByRowNum(1);
}
else if (playNumber <= 4)
{
ChangePlayerGridByRowNum(2);
}
else if (playNumber <= 9)
{
ChangePlayerGridByRowNum(3);
}
else if (playNumber <= 16)
{
ChangePlayerGridByRowNum(4);
}
else//太多预警没法显示
{
return;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
NewWarningPlay("192.168.1.65");
NewWarningPlay("192.168.1.108");
//PlalersNumberChange(tmpplayerRowNumber);
//tmpplayerRowNumber++;
//if (tmpplayerRowNumber > 4)
//{
// tmpplayerRowNumber = 1;
//}
}
private void chkAutoClose_Click(object sender, RoutedEventArgs e)
{
_autoClose = chkAutoClose.IsChecked;
//if (_autoClose == true)
//{
// RunAutoClosePlayerServer();
//}
}
private void RunAutoClosePlayerServer()
{
Task.Factory.StartNew(() =>
{
while (_running)
{
try
{
lock (this)
{
if (_playerNumber > 0)
{
AutoClose();
}
}
}catch(Exception ex)
{
LogFactory.GetLogger().Error(ex.Message);
}
Thread.Sleep(1000);
}
});
}
private void AutoClose()
{
int playNumber = 0;
List<IUCPlayer> playerList = _videoPlayManager.GetUCVideoList();
int icount = playerList.Count();
for (int i = icount - 1; i >= 0; i--)
{
IUCPlayer player = playerList[i];
if (player.IsPlaying())
{
if (player.IsTimeOut())
{
player.Stop();
//if (i > 0)
//{
RemoveFromView(player.GetName());
playerList.RemoveAt(i);
//}
playerList.Add(player);
AddToView(player);
continue;
}
playNumber++;
}
}
if(playNumber<4 )
{
if( _playerRowNumber >= 9)
{
ChangePlayerGridByAllPlayerNumber(playNumber);
}
}
else if (playNumber < 8)
{
if ( _playerRowNumber >= 16)
{
ChangePlayerGridByAllPlayerNumber(playNumber);
}
}
if (playNumber == 0)//关闭窗体时才修改窗体大小
{
if (_autoClose==true)
{
FormHide();
ChangePlayerGridByAllPlayerNumber(playNumber);
}
}
_playerNumber = playNumber;
}
/// <summary>
/// 从窗体删除
/// </summary>
/// <param name="ucname"></param>
private void RemoveFromView(string ucname)
{
this.panMain.Dispatcher.Invoke(new Action(() =>
{
var uiplayer = (UserControl)this.panMain.FindName(ucname);
if (uiplayer != null)
{
this.panMain.Children.Remove(uiplayer);
this.panMain.UnregisterName(ucname);
}
}));
}
/// <summary>
/// 从窗体删除
/// </summary>
/// <param name="ucname"></param>
private void AddToView(IUCPlayer videoPlay)
{
this.panMain.Dispatcher.Invoke(new Action(() =>
{
if (videoPlay != null)
{
this.panMain.Children.Add(videoPlay.GetControl());
this.panMain.RegisterName(videoPlay.GetName(), videoPlay.GetControl());
}
}));
}
private void Window_Closed(object sender, EventArgs e)
{
_running = false;
}
}
}