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)
{
}
}
}