需求:通过接入设备后,获取现场实时记录。

实现:通过配置NVR,设置间隔时间定时抓拍摄像头画面,通过SDK定时获取NVR对应通道的设备抓拍图片数据。

离线、上线、下载进度回调。

//初始化SDK接口
m_DisConnectCallBack += new fDisConnectCallBack(DisConnectCallBack);
m_ReConnectCallBack += new fHaveReConnectCallBack(ReConnectCallBack);
m_DownloadPosCallBack += new fTimeDownLoadPosCallBack(DownLoadPosCallBack);

建立NVR通道实体类型

private class nvr_data
{public int index { get; set; }//数据序列号public IntPtr m_LoginID { get; set; }//public IntPtr m_DownloadID { get; set; }public string filepath { get; set; }//抓拍图片路径public DateTime catchtime { get; set; }//抓拍时间public string devicecontent { get; set; }//设备信息public NET_DEVICEINFO_Ex m_DeviceInfo { get; set; }public string ip { get; set; }public string username { get; set; }public string password { get; set; }public bool download_flag { get; set; }//检测下载状态public int time { get; set; }//抓拍时间间隔public string channelanme { get; set; }//通道名称
}

通过配置XML文件读取通道信息

登录设备开启图片下载线程

//初始化抓拍路径
if (!Directory.Exists(path))
{Directory.CreateDirectory(path);
}
//初始化SDK接口
m_DisConnectCallBack += new fDisConnectCallBack(DisConnectCallBack);
m_ReConnectCallBack += new fHaveReConnectCallBack(ReConnectCallBack);
m_DownloadPosCallBack += new fTimeDownLoadPosCallBack(DownLoadPosCallBack);
try
{NETClient.Init(m_DisConnectCallBack, IntPtr.Zero, null);NETClient.SetAutoReconnect(m_ReConnectCallBack, IntPtr.Zero);
}
catch (Exception ex)
{this.BeginInvoke((Action<string>)setText, ex.Message);
}
this.BeginInvoke((Action<string>)setText, "初始化成功");
//开始初始化接口
UploadFileOss.StartUpload();//查询NVR配置
XmlDocument NRVconfig = new XmlDocument();
NRVconfig.Load(Application.StartupPath + "\\NRVconfig.xml");
XmlNodeList configration = NRVconfig.SelectNodes("configration");
if (configration != null && configration[0].HasChildNodes)
{for (int i = 0; i < configration[0].ChildNodes.Count; i++){XmlNode nvr = configration[0].ChildNodes[i];//初始化数据nvr_datas[i] = new nvr_data();nvr_datas[i].index = i;nvr_datas[i].ip = nvr.Attributes["ip"].Value;nvr_datas[i].username = nvr.Attributes["username"].Value;nvr_datas[i].password = nvr.Attributes["password"].Value;nvr_datas[i].time = Convert.ToInt32(nvr.Attributes["time"].Value);nvr_datas[i].catchtime = DateTime.Now.AddMinutes(nvr_datas[i].time * -2 - 1);nvr_datas[i].m_LoginID = IntPtr.Zero;nvr_datas[i].m_DownloadID = IntPtr.Zero;//登录NET_DEVICEINFO_Ex m_DeviceInfo = new NET_DEVICEINFO_Ex();nvr_datas[i].m_LoginID = NETClient.Login(nvr_datas[i].ip, 37777, nvr_datas[i].username, nvr_datas[i].password, EM_LOGIN_SPAC_CAP_TYPE.TCP, IntPtr.Zero, ref m_DeviceInfo);if (IntPtr.Zero == nvr_datas[i].m_LoginID){this.BeginInvoke((Action<string>)setText, nvr_datas[i].ip + NETClient.GetLastError());}else{string channelname = "通道1";bool ret = NETClient.QueryChannelName(nvr_datas[i].m_LoginID, ref channelname);if (ret){nvr_datas[i].channelanme = channelname;}else{this.BeginInvoke((Action<string>)setText, nvr_datas[i].ip + NETClient.GetLastError());}this.BeginInvoke((Action<string>)setText, "LoginID" + nvr_datas[i].m_LoginID + nvr_datas[i].ip + ",37777," + nvr_datas[i].username + "," + nvr_datas[i].password + "--登录成功");}nvr_datas[i].m_DeviceInfo = m_DeviceInfo;IntPtr pStream = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));NETClient.SetDeviceMode(nvr_datas[i].m_LoginID, EM_USEDEV_MODE.RECORD_STREAM_TYPE, pStream);}if (configration[0].ChildNodes.Count > 0){//开始下载ThreadPool.SetMaxThreads(2, 2);//从NVR数据零开始下载th_getpic1 = new Thread(download);th_getpic1.IsBackground = true;th_getpic1.Start(0);isdownload = true;ISCatch = true;this.BeginInvoke((Action<string>)setText, "开始下载");}
}

根据NVR设置的抓拍时间间隔下载数据,防止下载到重复数据,所有通道在一个线程中,轮循下载。

/// <summary>
/// 下载抓拍图片方法
/// </summary>
/// <param name="o"></param>
public void download(object o)
{try{int index = Convert.ToInt32(o);while (isdownload){DateTime now = DateTime.Now;//计算一分钟误差,防止方法执行的过程超过一分钟,数据获取不全//time*2 ,因为DateTime end = now.AddMinutes(time * -1);nvr_datas[index].catchtime = end;//相当于nvr_datas[index].time <= ((now.AddMinutes(time * -1) - nvr_datas[index].catchtime).Minutes - 1)if ((nvr_datas[index].time * 2) <= ((now - nvr_datas[index].catchtime).Minutes - 1)){if (upload_flag){IntPtr m_LoginID = nvr_datas[index].m_LoginID;//IntPtr m_DownloadID = nvr_datas[index].m_DownloadID;string filepath = path.TrimEnd(new char[] { '\\' }) + "\\" + nvr_datas[index].ip + now.Ticks.ToString() + ".jpg";DateTime end = now.AddMinutes(nvr_datas[index].time * -1);//取当前时间之前time分钟的数据DateTime start = end.AddMinutes(nvr_datas[index].time * -1);//取结束时间之前的time分钟数据//停止下载if (nvr_datas[index].m_DownloadID != IntPtr.Zero){bool ret = NETClient.StopDownload(nvr_datas[index].m_DownloadID);nvr_datas[index].m_DownloadID = IntPtr.Zero;}Thread.Sleep(1000);nvr_datas[index].catchtime = end;//抓拍时间为SDK中的结束时间nvr_datas[index].filepath = @filepath;nvr_datas[index].devicecontent = nvr_datas[index].channelanme;//目前只取通道名称//开始新的下载nvr_datas[index].m_DownloadID = NETClient.DownloadByTime(m_LoginID, 0, EM_QUERY_RECORD_TYPE.PICTURE, start, end, filepath, m_DownloadPosCallBack, IntPtr.Zero, null, IntPtr.Zero, IntPtr.Zero);this.BeginInvoke((Action<string>)setText, "开始新的查找 ip:" + nvr_datas[index].ip + " start:" + start.ToString("yyyy-MM-dd HH:mm:ss") + " end:" + end.ToString("yyyy-MM-dd HH:mm:ss") + "DownloadID" + nvr_datas[index].m_DownloadID);if (IntPtr.Zero == nvr_datas[index].m_DownloadID){this.BeginInvoke((Action<string>)setText, nvr_datas[index].ip + NETClient.GetLastError());}nvr_datas[index].download_flag = false;//延时五秒校验Thread.Sleep(1000 * 5);ThreadPool.QueueUserWorkItem(ISCatchPIC, index);}}Thread.Sleep(1000 * 60);//一分钟循环一次,默认最大下载时间为1分钟index = nvr_datas[index + 1] == null ? 0 : index + 1;}}catch (Exception ex){this.BeginInvoke((Action<string>)setText, ex.ToString() + ex.StackTrace.ToString());}
}

nvr储存的图片有时几百K,有时几M,有时则是有图片参数正确,但是却不能下载,为了防止影响之后的数据下载,进行了超时校验。

/// <summary>
/// 检测下载状态是否异常,异常需要重新下载
/// </summary>
/// <param name="o"></param>
private void ISCatchPIC(object o)
{try{int index = Convert.ToInt32(o);while (!nvr_datas[index].download_flag && ISCatch){this.BeginInvoke((Action<string>)setText, nvr_datas[index].ip + "重新查找图片");IntPtr m_LoginID = nvr_datas[index].m_LoginID;//停止下载if (nvr_datas[index].m_DownloadID != IntPtr.Zero){bool ret = NETClient.StopDownload(nvr_datas[index].m_DownloadID);if (!ret){this.BeginInvoke((Action<string>)setText, nvr_datas[index].ip + NETClient.GetLastError());}nvr_datas[index].m_DownloadID = IntPtr.Zero;}bool result = NETClient.Logout(m_LoginID);if (!result){this.BeginInvoke((Action<string>)setText, nvr_datas[index].ip + NETClient.GetLastError());}Thread.Sleep(1000 * 1);NET_DEVICEINFO_Ex m_DeviceInfo = new NET_DEVICEINFO_Ex();nvr_datas[index].m_LoginID = NETClient.Login(nvr_datas[index].ip, 37777, nvr_datas[index].username, nvr_datas[index].password, EM_LOGIN_SPAC_CAP_TYPE.TCP, IntPtr.Zero, ref m_DeviceInfo);nvr_datas[index].m_DeviceInfo = m_DeviceInfo;this.BeginInvoke((Action<string>)setText, nvr_datas[index].ip + " 登录成功 LoginID" + nvr_datas[index].m_LoginID);//重新开始下载Thread.Sleep(1000);DateTime now = DateTime.Now;string filepath = path.TrimEnd(new char[] { '\\' }) + "\\" + now.Ticks.ToString() + ".jpg";DateTime end = now.AddMinutes(nvr_datas[index].time * -1);//取当前时间之前time分钟的数据DateTime start = end.AddMinutes(nvr_datas[index].time * -1);//取结束时间之前的time分钟数据nvr_datas[index].catchtime = end;//抓拍时间为SDK中的结束时间nvr_datas[index].filepath = filepath;nvr_datas[index].m_DownloadID = NETClient.DownloadByTime(m_LoginID, 0, EM_QUERY_RECORD_TYPE.PICTURE, start, end, filepath, m_DownloadPosCallBack, IntPtr.Zero, null, IntPtr.Zero, IntPtr.Zero);//开始新的下载this.BeginInvoke((Action<string>)setText, "开始新的查找 ip:" + nvr_datas[index].ip + " start:" + start.ToString("yyyy-MM-dd HH:mm:ss") + " end:" + end.ToString("yyyy-MM-dd HH:mm:ss") + "DownloadID" + nvr_datas[index].m_DownloadID);if (IntPtr.Zero == nvr_datas[index].m_DownloadID){this.BeginInvoke((Action<string>)setText, nvr_datas[index].ip + NETClient.GetLastError());}nvr_datas[index].download_flag = false;//延时5秒校验Thread.Sleep(1000 * 5);//getpic_timer = new System.Threading.Timer(new TimerCallback(download), drs[0], 1000 * 1, 1000 * 60 * time);}}catch (ThreadAbortException){Thread.ResetAbort();this.BeginInvoke((Action<string>)setText, "ThreadAbortException  ");}catch (Exception ex){this.BeginInvoke((Action<string>)setText, ex.ToString() + ex.StackTrace.ToString());}
}

下载进度为实时监视下载过程使用,dwDownLoadSize---当次数据长度,dwDownLoadSize--数据总长度

private void DownLoadPosCallBack(IntPtr lPlayHandle, uint dwTotalSize, uint dwDownLoadSize, int index_, NET_RECORDFILE_INFO recordfileinfo, IntPtr dwUser)

大华摄像头抓拍图像实时下载相关推荐

  1. java制作h5视频聊天_JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。...

    JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路. 2018-09-17 问题:大华IPC枪型摄像头需要在WEB中显示实时监控视频,官方提供的SDK只有C#的桌面程序访问方式. 解决 ...

  2. JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。

    问题:大华IPC枪型摄像头需要在WEB中显示实时监控视频,官方提供的SDK只有C#的桌面程序访问方式. 解决思路: RTSP协议访问方式将RTSP流转换成hls文件在H5的video播放器中进行播放实 ...

  3. JAVA大华摄像头抓拍与API接口集成

    官网SDK下载地址 我下载的是JAVA-win64版本,所需dll文件以及配置文件全都在里面打包好了,并且官方的指导手册文档,写的都挺详细的,下面重点说一下,我在开发过程中遇到的问题. 1.load ...

  4. H5无插件实现实时海康、大华摄像头网页预览

    H5无插件实现实时海康.大华摄像头网页预览 前景概述 功能特点 效果 http接口管理 流列表接口 实现过程 解决的问题 前景概述 最近项目中需要用到"网页实时预览网络摄像头"功能 ...

  5. 大华摄像头实现web端实时播放以及录像回放

    文章目录 前言 一.在乐橙云平台上注册账号并添加设备创建应用 二.利用云平台的api获取到前端展示需要的相关信息 三.前端页面展示内容 总结 前言 前段时间对接了大华摄像头,在此做一次总结,总体思路是 ...

  6. WEB页面播放大华摄像头视频解决方案

    目前在网页上播放大华摄像头视频,有如下2种途径: 1)首选获取摄像头的hls协议地址,H5可直接播放 2)获取摄像头rtsp协议地址,用ffmpeg转换成hls再播放 近期做的一个项目,需要在WEB端 ...

  7. 华为海康大华摄像头编译RTSP转RTMP和HTTPFLV

    华为海康大华摄像头编译RTSP转RTMP和HTTPFLV 项目需求要看摄像头实时画面谷歌浏览器不支持RTSP流直接展示 方案一 通过Java+nginx+rtsp转rtmp流 方案二 通过Java+ ...

  8. 大华摄像头二次开发-web端实现实时视频监控

    最近客户提需要,需要在现有的系统中集成视频监控功能,摄像头是大华的.而大华又没有关于java的sdk,官网只能下载到c++的demo和dll文件.无奈只能自己在网上找了,最后找到了一些解决办法,把实现 ...

  9. 部署 WVP+ZLMediaKit 实现大华摄像头接入

    0. 整体部署安排 redis 服务:172.22.100.172:10284 ZLMediaKit:172.22.100.177 WVP:172.22.100.54 1. 部署 ZLMediaKit ...

最新文章

  1. 定义一个有参宏判断一个字符是否在0~9之间
  2. 【BZOJ】1105: [POI2007]石头花园SKA
  3. 定制你的敏捷方法:以结果为导向
  4. Android动态申请多个权限-非第三方框架
  5. 学习强制删除正在运行的文件
  6. 计算机控制论文,计算机控制系统论文.ppt
  7. 统计学基础一:基础概念
  8. LINUX下载编译libgsm
  9. 【毕业设计/课程设计】基于大数据个性化音乐推荐算法分析
  10. DRF总结(三)Serializer的使用
  11. 阻抗匹配是什么意思?阻抗匹配原理详解
  12. MATLAB--读取广播星历的导航文件
  13. ksz9031 mmd读取不了_Ambarella 平台KSZ9031网卡直连不识别问题
  14. 微信小程序自定义底部导航栏遮挡页面内容(已解决)
  15. 第十周 项目二 小刚破译加密密码
  16. inventor2五子棋游戏apk_五子棋大师2中文版游戏
  17. nagios监控 mysql 表结构
  18. 在实体引用中,实体名称必须紧跟在 ‘’后面
  19. 手机进水开机android,手机进水后开机只有启动画面进不了桌面怎么处理?
  20. 在线项目管理软件的重要性

热门文章

  1. FPGA数字时钟系统-设计教程
  2. 没有水印的夸克免费扫描
  3. 零基础如何学习Java和web前端
  4. openlayers给要素加文字注记
  5. 腾讯“鹅城”开建,斥资370亿;提前泄露小米新机博主被判赔偿100万;传字节跳动实习生删除GB以下所有机器学习模型 | EA周报...
  6. Thingsboard 2.5 CE版本项目结构说明
  7. 你写论文时发现了哪些非常神的网站?
  8. 计算机直接切换到桌面,屏幕如何快速切换桌面
  9. halting problem 详解
  10. CSS,font-family,好看常用的中文字体