0230204_FZLH_upperpc/fuqing/Nanji_Island/UIControl_HBGK.cs

830 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using System.Threading;
using System.Drawing.Imaging;
namespace Nanji_Island
{
public partial class UIControl_HBGK : UserControl
{
private ChannelInfo infoChannel;
IP_NET_DVR_DEVICEINFO deviceInfo = new IP_NET_DVR_DEVICEINFO();
//播放Panel中心和鼠标坐标两点的差距
public float X = 0;
public float Y = 0;
//是否移动
public bool isMove = false;
//在pnlReplayVideo的鼠标形状
private System.Windows.Forms.Cursor sbFlag = System.Windows.Forms.Cursors.Default;
/// <summary>
/// 设置或获取鼠标样式
/// </summary>
public System.Windows.Forms.Cursor SbFlag
{
get
{
return sbFlag;
}
set
{
sbFlag = value;
}
}
//是否控制pnlReplayVideo
private bool isControl = false;
//云台控制的速度比例
double PSZspeed = 1.0;
/// <summary>
/// 用户编号,登陆的返回值
/// </summary>
private int m_userID = 0;
/// <summary>
/// 播放后的返回值
/// </summary>
public int m_realPlay = -1;
public int m_bSetParam = -1;
public bool haveLogin = false;
fRealDataCallBack fReadlCallBack = null;
fDecCallBackFunction fDecodecall = null;
StatusEventCallBack fStatusCallBack = null;
/// <summary>
/// 速度
/// </summary>
private string speed = "6";
public UIControl_HBGK()
{
InitializeComponent();
}
private static bool bHaveInitTwoDll = false;
public UIControl_HBGK(ChannelInfo channelInfo)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
this.infoChannel = channelInfo;
if (!bHaveInitTwoDll)
{
bHaveInitTwoDll = true;
PLAYERDLL.IP_TPS_Init();
NETSDKDLL.IP_NET_DVR_Init();
}
fDecodecall = new fDecCallBackFunction(OnDecCallBackFunction);
fReadlCallBack = new fRealDataCallBack(OnRealDataCallBack);
fStatusCallBack = new StatusEventCallBack(OnStatusEventCallBack);
try
{
if (infoChannel.nDeviceType != 2)
{//NVR不用登录
if (!InitAndLogin())
{
return;
}
}
else
{
m_realPlay = RealPlayVideo();
if (m_realPlay > 0)
{
//ILog.WriteEventLog("播放成功!");
return;
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
MessageBox.Show("视频预览失败,错误编号:" + GetError(ID));
}
}
/*System.Threading.Thread.Sleep(1000);
m_realPlay = RealPlayVideo();
if (m_realPlay > 0)
{
//ILog.WriteEventLog("播放成功!");
return;
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
MessageBox.Show("视频预览失败,错误编号:" + GetError(ID));
}*/
}
catch (Exception ex)
{
throw ex;
}
}
public int OnStatusEventCallBack(int lUser, int nStateCode, IntPtr pResponse, IntPtr pUser)
{
if (lUser == m_userID)
{
if (nStateCode == (int)enumNetSatateEvent.EVENT_LOGINOK)
{
haveLogin = true;
if (m_realPlay <= 0)
{
m_realPlay = RealPlayVideo();
}
}
else if (nStateCode == (int)enumNetSatateEvent.EVENT_LOGINFAILED || nStateCode == (int)enumNetSatateEvent.EVENT_LOGIN_USERERROR)
{
haveLogin = false;
}
}
return 0;
}
public int OnDecCallBackFunction(int nPort, IntPtr pBuf, int nSize, ref FRAME_INFO pFrameInfo, IntPtr pUser, int nReserved2)
{
int kkk = 0;
int jj = 0;
return 0;
}
#region ICCTVBrowse
//public event EventClickAxAVShow eventClickAxAVShow;
//public event EventControlAV eventControlAV;
//public event EventOnLBDown eventOnLBDown;
//public event EventOnLBUp eventOnLBUp;
//public event EventDoubleClick eventDoubleClick;
//public event EventDMenuClick eventDMenuClick;
public void SetChoosed(bool chooseFlag)
{
//throw new Exception("The method or operation is not implemented.");
}
string saveFileFullPath = "";
string newFileName = "";
public string StartKinescope(string filePath)
{
try
{
string saveFileName = "realVideo_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".hik";
return StartKinescope(filePath, saveFileName);
}
catch (Exception ex)
{
throw ex;
}
}
public string StartKinescope(string filePath, string fileName)
{
try
{
saveFileFullPath = filePath + "\\" + fileName;
int startRecord = 0;
//ILog.WriteEventLog("saveFileFullPath:" + saveFileFullPath);
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
startRecord = NETSDKDLL.IP_NET_DVR_StartRecord(m_realPlay, saveFileFullPath.Substring(0, saveFileFullPath.Length - 4) + ".avi", 1800, 1800);
//ILog.WriteEventLog("startRecord:" + startRecord);
newFileName = Path.GetDirectoryName(saveFileFullPath);
//ILog.WriteEventLog("newFileName:" + newFileName + "\\");
if (startRecord > 0)
{
return "开始录像,路径-" + newFileName;
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
return "录像失败:" + ID + GetError(ID);
}
}
catch (Exception ex)
{
throw ex;
}
}
public string StopKinescope()
{
try
{
int stopRecord = 0;
string result = "";
stopRecord = NETSDKDLL.IP_NET_DVR_StopRecord(m_realPlay);
Thread.Sleep(500);
//ILog.WriteEventLog(("源文件:" + saveFileFullPath + ",目标文件:" + newFileName));
if (stopRecord > 0)
{
result = "停止录像";
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
result = "停止录像失败:" + ID + GetError(ID);
}
return result;
}
catch (Exception)
{
return "录像或下载失败";
}
}
public string TakePictures(string filePath, string fileName)
{
//try
//{
// ILog.WriteEventLog("进入截图+:" + filePath);
// string result = "";
// string tmpFileName = filePath + "\\" + DateTime.Now.ToFileTime().ToString() + ".bmp";
// bool getPicture = NETSDKDLL.HB_SDVR_CapturePicture(m_realPlay, tmpFileName);
// Thread.Sleep(1000);
// Image bmp = Bitmap.FromFile(tmpFileName);
// if (!Directory.Exists(filePath))
// {
// Directory.CreateDirectory(filePath);
// }
// bmp.Save(filePath + "\\" + fileName, ImageFormat.Jpeg);
// bmp.Dispose();
// try
// {
// if (File.Exists(tmpFileName))
// {
// File.Delete(tmpFileName);
// }
// }
// catch
// {
// }
// if (getPicture)
// {
// result = "截图成功,路径-" + filePath + "-ID:" + infoChannel.ErrId + "-" + tmpFileName;
// }
// else
// {
// int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
// result = "截图失败:" + ID + GetError(ID);
// }
// return result;
//}
//catch (Exception ex)
//{
return "截图失败";
//}
}
public string TakePictures(string filePath)
{
try
{
string tmpFileName = DateTime.Now.ToFileTime().ToString() + ".jpg";
return TakePictures(filePath, tmpFileName);
}
catch (Exception ex)
{
return "截图失败:" + ex.Message;
}
}
public bool GetIsHaveVideo()
{
return true;
}
public bool GetIsHavePic()
{
return true;
}
private int actionType = 0;
public bool PtzControl(string deviceID, string channelID, Nanji_Island.EnumCollection.EnumCCTVControlType ecccTVCT, out string result)
{
try
{
int uSpeed = Convert.ToUInt16(int.Parse(this.speed) * PSZspeed);
string xmlaction = string.Empty;
int stResult = -1;
bool isSpeed = false;
switch (ecccTVCT)
{
case Nanji_Island.EnumCollection.EnumCCTVControlType.TILT_UP:
//actionType = 17;
xmlaction = "up";
isSpeed = true;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.TILT_DOWN:
//actionType = 18;
xmlaction = "down";
isSpeed = true;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.PAN_LEFT:
xmlaction = "left";
isSpeed = true;
//actionType = 21;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.PAN_RIGHT:
xmlaction = "right";
isSpeed = true;
//actionType = 22;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.Pan_NW:
xmlaction = "left_up";
isSpeed = true;
//actionType = 19;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.Pan_NE:
xmlaction = "right_up";
isSpeed = true;
//actionType = 20;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.Pan_SW:
xmlaction = "left_down";
isSpeed = true;
//actionType = 23;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.Pan_SE:
xmlaction = "right_down";
isSpeed = true;
//actionType = 24;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.ZOOM_IN:
xmlaction = "zoomtele";
//actionType = 11;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.ZOOM_OUT:
xmlaction = "zoomwide";
//actionType = 9;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.FOCUS_FAR:
xmlaction = "FocusFarAutoOff";
//actionType = 14;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.FOCUS_NEAR:
xmlaction = "FocusNearAutoOff";
//actionType = 13;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.IRIS_OPEN:
xmlaction = "IrisOpenAutoOff";
//actionType = 15;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.IRIS_CLOSE:
xmlaction = "IrisCloseAutoOff";
//actionType = 16;
break;
case Nanji_Island.EnumCollection.EnumCCTVControlType.STOP:
xmlaction = "stop";
//actionType = 30;
break;
default:
xmlaction = "stop";
//actionType = 30;
break;
}
string xmlBody = "<xml>";
xmlBody = xmlBody + "<cmd>" + xmlaction + "</cmd>";
if (isSpeed)
{
xmlBody = xmlBody + "<panspeed>" + uSpeed.ToString() + "</panspeed>";
xmlBody = xmlBody + "<tiltspeed>" + uSpeed.ToString() + "</tiltspeed>";
}
xmlBody = xmlBody + "</xml>";
stResult = NETSDKDLL.IP_NET_DVR_PTZControlEx(m_userID, xmlBody);
if (stResult < 0)
{
result = "控制失败--stResult:" + stResult + ",infoChannel.MonitorName:" + infoChannel.MonitorName + ",actionType:" + actionType;
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
//ILog.WriteErrorLog("之后错误ID" + ID);
return false;
}
result = "控制成功";
return true;
}
catch (Exception ex)
{
throw ex;
}
}
public bool IsPTZControl
{
get
{
return true;
}
}
public bool RequestControl()
{
return false;
}
public bool StopControl()
{
return false;
}
public bool ReleaseResources(string stopClass)
{
try
{
StopRealPlayVideo(this.m_realPlay);
//ClearupVideo();
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return false;
}
public bool VideoLogin()
{
return true;
}
public bool VideoLogOut()
{
LogoutVideo(m_userID);
System.Threading.Thread.Sleep(200);
return true;
}
public bool SetPreset(int presetId, out string result)
{
if (NETSDKDLL.IP_NET_DVR_PTZPreset(m_userID, 8, presetId) > 0)
{
result = "设置预置位成功";
return true;
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
result = "设置预置位失败" + ID + GetError(ID);
return false;
}
}
public bool GetPreset(int presetId, out string result)
{
if (NETSDKDLL.IP_NET_DVR_PTZPreset(m_userID, 39, presetId) > 0)
{
result = "调用预置位成功";
return true;
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
result = "调用预置位失败" + ID + GetError(ID);
return false;
}
}
public void SetControlSpeed(string controlSpeed)
{
this.speed = controlSpeed;
}
public ChannelInfo getChannel()
{
return infoChannel;
}
#endregion
public bool PTZPreset(EnumCollection.EnumCCTVControlType ecccTVCT, int dwPresetIndex, out string result)
{
try
{
if (ecccTVCT == Nanji_Island.EnumCollection.EnumCCTVControlType.SET_PRESET)
{
if (NETSDKDLL.IP_NET_DVR_PTZPreset(
m_realPlay, 8, dwPresetIndex) > 0)
{
result = "设置预置位成功";
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
result = "设置预置位失败" + ID + GetError(ID);
}
}
else if (ecccTVCT == Nanji_Island.EnumCollection.EnumCCTVControlType.GO_PRESET)
{
if (NETSDKDLL.IP_NET_DVR_PTZPreset(
m_realPlay, 39, dwPresetIndex) > 0)
{
result = "调用预置位成功";
}
else
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
result = "调用预置位失败" + ID + GetError(ID);
}
}
else
{
result = "";
return false;
}
return true;
}
catch (Exception ex)
{
throw ex;
}
}
public int StopRealPlayVideo(int lRealHandle)
{
try
{
int nRet = NETSDKDLL.IP_NET_DVR_StopRealPlay(lRealHandle);
PLAYERDLL.IP_TPS_DeleteStream(infoChannel.nPlayPort);
m_realPlay = -1;
m_bSetParam = -1;
return nRet;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
#region 退
//*****************************************************************************************
/// <summary>
/// 退出视频
/// </summary>
/// <param name="lUserID">用户ID</param>
/// <returns>是否成功</returns>
//*****************************************************************************************
public int LogoutVideo(int lUserID)
{
try
{
int logOut = -1;
if (lUserID != -1)
{
logOut = NETSDKDLL.IP_NET_DVR_Logout(lUserID);
}
return logOut;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
#endregion
#region
//*****************************************************************************************
/// <summary>
/// 清除视频
/// </summary>
/// <returns>是否成功</returns>
//*****************************************************************************************
public int ClearupVideo()
{
try
{
NETSDKDLL.IP_NET_DVR_Cleanup();
PLAYERDLL.IP_TPS_ReleaseAll();
return 1;
}
catch (Exception ex)
{
return -1;
}
}
#endregion
public bool StopVideo(string chlID, int userID)
{
try
{
if (StopRealPlayVideo(this.m_realPlay) > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
}
private bool InitAndLogin()
{
try
{
if (InitVideo() == 0)
{
if (m_userID != 0)
{
NETSDKDLL.IP_NET_DVR_Cleanup();
NETSDKDLL.IP_NET_DVR_Logout(m_userID);
System.Threading.Thread.Sleep(200);
haveLogin = false;
}
NETSDKDLL.IP_NET_DVR_SetStatusEventCallBack(fStatusCallBack, IntPtr.Zero);
m_userID = LoginVideo(this.infoChannel.RemoteIP.Trim(),
(short)(Convert.ToInt32(this.infoChannel.PtzPort)),
this.infoChannel.RemoteUser.Trim(),
this.infoChannel.RemotePwd.Trim(),
ref deviceInfo);//
if (m_userID == -1)
{
int ID = (int)NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
//ILog.WriteEventLog("登录失败,错误码:" + ID + GetError(ID));
return false;
}
return true;
}
else
{
int ID = NETSDKDLL.IP_NET_DVR_GetLastErrorCode(0);
MessageBox.Show("初始化失败:" + ID + GetError(ID));
return false;
}
}
catch (Exception)
{
return false;
}
}
private static bool bHaveInitVideo = false;
public int InitVideo()
{
try
{
if (!bHaveInitVideo)
{
bHaveInitVideo = true;
return NETSDKDLL.IP_NET_DVR_Init();
}
return 0;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public int LoginVideo(string sDVRIP, short wDVRPort, string sUserName, string sPassword, ref IP_NET_DVR_DEVICEINFO lpDeviceInfo)
{
try
{
int logIn = -1;
if (sDVRIP != "" && sUserName != "" && sPassword != "")
{
logIn = NETSDKDLL.IP_NET_DVR_Login(sDVRIP, wDVRPort, sUserName, sPassword, ref lpDeviceInfo);
}
return logIn;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public string GetError(int ErrorId)
{
return "";
}
public int RealPlayVideo()
{
try
{
if (m_realPlay == 0)
{
NETSDKDLL.IP_NET_DVR_StopRealPlay(m_realPlay);
System.Threading.Thread.Sleep(200);
}
IP_NET_DVR_CLIENTINFO clientInfo = new IP_NET_DVR_CLIENTINFO();
USRE_VIDEOINFO puser = new USRE_VIDEOINFO();
clientInfo.lChannel = int.Parse(infoChannel.ChlID);
puser.pUserData = this.VideoPanel.Handle;
puser.nVideoPort = infoChannel.RemotePort;
puser.bIsTcp = 1;
if (this.infoChannel.nDeviceType == 2)
{
puser.nVideoChannle = (infoChannel.nDeviceType << 16) | (int.Parse(infoChannel.RemoteChannle) | (int.Parse(infoChannel.ChlID) << 8));
}
else
{
puser.nVideoChannle = 1;
}
m_realPlay = NETSDKDLL.IP_NET_DVR_RealPlayEx(m_userID, this.infoChannel.RemoteIP, infoChannel.RemoteUser, infoChannel.RemotePwd, fReadlCallBack, ref puser, 0);//"tps://" +
infoChannel.nRealDataHandle = m_realPlay;
return m_realPlay;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public int OnRealDataCallBack(int lRealHandle, int dwDataType, IntPtr pBuffer, int dwBufSize, ref FRAME_EXTDATA pExtData)
{
IntPtr pWnd = pExtData.pUserData;
if (pWnd == this.VideoPanel.Handle)
{
if (dwDataType == 0)
{
return PLAYERDLL.IP_TPS_InputVideoData(infoChannel.nPlayPort, pBuffer, dwBufSize, pExtData.bIsKey, (int)pExtData.timestamp);
}
else if (dwDataType == 1)
{
return PLAYERDLL.IP_TPS_InputAudioData(infoChannel.nPlayPort, pBuffer, dwBufSize, (int)pExtData.timestamp);
}
else if (dwDataType == 2 && m_bSetParam == -1)
{
STREAM_AV_PARAM avParam = new STREAM_AV_PARAM();
avParam = (STREAM_AV_PARAM)Marshal.PtrToStructure(pBuffer, avParam.GetType());
int size = Marshal.SizeOf(typeof(VIDEO_PARAM));
IntPtr pVideoParam = Marshal.AllocHGlobal(10240);
Marshal.StructureToPtr(avParam.videoParam, pVideoParam, false);
int nPortValue = infoChannel.nPlayPort;
PLAYERDLL.IP_TPS_OpenStream(nPortValue, pVideoParam, size, 0, 40);
if (avParam.bHaveAudio != 0)
{
IntPtr pAudioParam = Marshal.AllocHGlobal(10240);
Marshal.StructureToPtr(avParam.audioParam, pAudioParam, false);
int size1 = Marshal.SizeOf(typeof(AUDIO_PARAM));
PLAYERDLL.IP_TPS_OpenStream(nPortValue, pAudioParam, size1, 1, 30);
}
Marshal.FreeHGlobal(pVideoParam);
//如果不想播放只需要解码后的数据,请将后面两行代码打开,后面第三行代码注释掉
//PLAYERDLL.IP_TPS_SetDecCallBack(nPortValue, fDecodecall, IntPtr.Zero);
//PLAYERDLL.IP_TPS_Play(nPortValue, IntPtr.Zero);
PLAYERDLL.IP_TPS_Play(nPortValue, this.VideoPanel.Handle);
m_bSetParam = 1;
}
}
return 0;
}
private void VideoPanel_Paint(object sender, PaintEventArgs e)
{
}
}
}