C#调用海康sdk定时抓图(后台进行预览)
由于公司项目之前涉及到海康威视监控的图片抓取,在海康官网下找到海康的Demo,于是在此基础上进行开发,实现了海康定时抓图的功能。
部分说明和参考:https://blog.youkuaiyun.com/chenwei0731/article/details/109899332
图片抓取的主要代码
//需要的参数
public struct Dataparamer
{
//开始时间
public DateTime starttime;
//结束时间
public DateTime endtime;
//结果
public string errorInfo;
public bool status;
//文件名
public string bmpname;
//摄像头的通道号
public int channel;
//保持地址
public string bmpaddress;
//录像机的uil地址
public string url;
//端口
public int port;
//账户
public string user;
//密码
public string password;
}
//图片抓取
public static Dataparamer GetImageFile(Dataparamer data)
{
CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
Int32 m_lUserID = -1;
Int32 m_lPlayHandle = -1;
int[] iChannelNum = new int[96];
uint errorCode;
bool m_bInitSDK = false;
CHCNetSDK.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40 = new CHCNetSDK.NET_DVR_IPPARACFG_V40();
CHCNetSDK.NET_DVR_GET_STREAM_UNION m_unionGetStream;
CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo;
Dataparamer refdata = new Dataparamer();
try
{
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
throw new Exception("初始化失败");
}
else
{
//保存SDK日志
CHCNetSDK.NET_DVR_SetLogToFile(3, "D:\\SdkLog\\", true);
}
var Url = data.url;
var Port = data.port;
var User = data.user;
var Password = data.password;
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(Url, Port, User, Password, ref DeviceInfo);
if (m_lUserID < 0)
{
errorCode = CHCNetSDK.NET_DVR_GetLastError();
throw new Exception("登录失败,错误代码:" + errorCode + refdata.flag + " ip:" + Url);
}
else
{
ExceptionLogHelper.WriteLog("登录成功");
Console.WriteLine("登录成功");
uint dwAChanTotalNum = (uint)DeviceInfo.byChanNum;
uint dwDChanTotalNum = (uint)DeviceInfo.byIPChanNum + 256 * (uint)DeviceInfo.byHighDChanNum;
if (dwDChanTotalNum > 0)
{
#region 获取通道
uint dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40);
IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);
uint dwReturn = 0;
int iGroupNo = 0; //该方法仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取
if (!CHCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
{
errorCode = CHCNetSDK.NET_DVR_GetLastError();
throw new Exception("获取IP资源配置信息失败,错误代码:" + errorCode);
}
else
{
// 获取通道成功
m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
for (int i = 0; i < dwAChanTotalNum; i++)
{
iChannelNum[i] = i + (int)DeviceInfo.byStartChan;
}
byte byStreamType;
uint iDChanNum = 64;
if (dwDChanTotalNum < 64)
{
iDChanNum = dwDChanTotalNum; //如果设备IP通道小于64路,按实际路数获取
}
for (int i = 0; i < iDChanNum; i++)
{
iChannelNum[i + dwAChanTotalNum] = i + (int)m_struIpParaCfgV40.dwStartDChan;
byStreamType = m_struIpParaCfgV40.struStreamMode[i].byGetStreamType;
m_unionGetStream = m_struIpParaCfgV40.struStreamMode[i].uGetStream;
switch (byStreamType)
{
//目前NVR仅支持0- 直接从设备取流一种方式
case 0:
dwSize = (uint)Marshal.SizeOf(m_unionGetStream);
IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
Marshal.StructureToPtr(m_unionGetStream, ptrChanInfo, false);
m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));
Marshal.FreeHGlobal(ptrChanInfo);
break;
default:
break;
}
}
}
#endregion
}
else
{
for (int i = 0; i < dwAChanTotalNum; i++)
{
iChannelNum[i] = i + (int)DeviceInfo.byStartChan;
}
}
ExceptionLogHelper.WriteLog("完成通道获取");
for (int i = 0; i < iChannelNum.Length; i++)
{
if (iChannelNum[(int)i] != data.channel) { continue; } //通道判断,是否等于当前通道
uint dcSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40);
m_unionGetStream = m_struIpParaCfgV40.struStreamMode[i].uGetStream;
dcSize = (uint)Marshal.SizeOf(m_unionGetStream);
IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dcSize);
Marshal.StructureToPtr(m_unionGetStream, ptrChanInfo, false);
m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));
if (m_struChanInfo.byIPID == 0) { throw new Exception("当前通道为空状态,请检查摄像头硬件"); } //通道状态判断,不能为空闲状态
CHCNetSDK.NET_DVR_VOD_PARA struVodPara = new CHCNetSDK.NET_DVR_VOD_PARA();
struVodPara.dwSize = (uint)Marshal.SizeOf(struVodPara);
struVodPara.struIDInfo.dwChannel = (uint)data.channel; //通道号 Channel number
struVodPara.hWnd = (IntPtr)(0x00121);
//设置回放的开始时间 Set the starting time to search video files
struVodPara.struBeginTime.dwYear = (uint)data.starttime.Year;
struVodPara.struBeginTime.dwMonth = (uint)data.starttime.Month;
struVodPara.struBeginTime.dwDay = (uint)data.starttime.Day;
struVodPara.struBeginTime.dwHour = (uint)data.starttime.Hour;
struVodPara.struBeginTime.dwMinute = (uint)data.starttime.Minute;
struVodPara.struBeginTime.dwSecond = (uint)data.starttime.Second;
//设置回放的结束时间 Set the stopping time to search video files
struVodPara.struEndTime.dwYear = (uint)data.endtime.Year;
struVodPara.struEndTime.dwMonth = (uint)data.endtime.Month;
struVodPara.struEndTime.dwDay = (uint)data.endtime.Day;
struVodPara.struEndTime.dwHour = (uint)data.endtime.Hour;
struVodPara.struEndTime.dwMinute = (uint)data.endtime.Minute;
struVodPara.struEndTime.dwSecond = (uint)data.endtime.Second;
m_lPlayHandle = CHCNetSDK.NET_DVR_PlayBackByTime_V40(m_lUserID, ref struVodPara);
if (m_lPlayHandle < 0)
{
errorCode = CHCNetSDK.NET_DVR_GetLastError();
throw new Exception("开始回放失败,错误代码:" + errorCode); //回放失败,输出错误号
}
uint iOutValue = 0;
if (!CHCNetSDK.NET_DVR_PlayBackControl_V40(m_lPlayHandle, CHCNetSDK.NET_DVR_PLAYSTART, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue))
{
errorCode = CHCNetSDK.NET_DVR_GetLastError();
throw new Exception("回放控制失败,错误代码:" + errorCode); //回放控制失败,输出错误号
}
if (!CHCNetSDK.NET_DVR_PlayBackCaptureFile(m_lPlayHandle, data.bmpaddress))
{
errorCode = CHCNetSDK.NET_DVR_GetLastError();
throw new Exception("抓图失败,错误代码:" + errorCode); //抓图失败,输出错误号
}
else
{
DateTime t = DateTime.Now.AddMinutes(1); //循环等待60秒
while (DateTime.Now < t)
{
if (File.Exists(data.bmpaddress))
{
ExceptionLogHelper.WriteLog("抓图成功");
refdata.status = true;
t = DateTime.Now;
}
}
}
}
refdata.errorInfo = "下载成功";
refdata.starttime = data.starttime;
refdata.endtime = data.starttime.AddSeconds(2);
refdata.bmpaddress = data.bmpaddress;
}
}
catch (Exception e)
{
e.WriteLog();
refdata.errorInfo = e.Message;
refdata.status = false;
ExceptionLogHelper.WriteLog(e.Message);
ExceptionLogHelper.WriteLog("下载失败");
return refdata;
}
return refdata;
}
关于海康的dome可以在百度中搜索下,有很多,,,,