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; /// /// 设置或获取鼠标样式 /// public System.Windows.Forms.Cursor SbFlag { get { return sbFlag; } set { sbFlag = value; } } //是否控制pnlReplayVideo private bool isControl = false; //云台控制的速度比例 double PSZspeed = 1.0; /// /// 用户编号,登陆的返回值 /// private int m_userID = 0; /// /// 播放后的返回值 /// public int m_realPlay = -1; public int m_bSetParam = -1; public bool haveLogin = false; fRealDataCallBack fReadlCallBack = null; fDecCallBackFunction fDecodecall = null; StatusEventCallBack fStatusCallBack = null; /// /// 速度 /// 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 = ""; xmlBody = xmlBody + "" + xmlaction + ""; if (isSpeed) { xmlBody = xmlBody + "" + uSpeed.ToString() + ""; xmlBody = xmlBody + "" + uSpeed.ToString() + ""; } xmlBody = xmlBody + ""; 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 退出视频 //***************************************************************************************** /// /// 退出视频 /// /// 用户ID /// 是否成功 //***************************************************************************************** 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 清除视频 //***************************************************************************************** /// /// 清除视频 /// /// 是否成功 //***************************************************************************************** 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) { } } }