说明
通过后台代码抓取海康录像机视频的方法,需要将海康程序中自带的几个dll文件放在程序的根目录下面
dll下载地址https://download.csdn.net/download/chenwei0731/13161725
实体
/// <summary>
/// 视频相关参数
/// </summary>
public struct VideoDataParamer
{
//开始试接
public DateTime starttime;
public DateTime endtime;//结束试接
public string errorInfo;
public bool status;//状态
public string name;//名称
public int channel;//通道
public string url;//地址ip
public int port;//端口
public string user;//用户
public string password;//密码
public string ip;//地址ip
/// <summary>
/// 本地文件的全路径
/// </summary>
public string address;
}
方法
/// <summary>
/// 状态标识
/// </summary>
public static bool flag = true;
/// <summary>
/// 从海康摄像头的存储系统里下载视频资料。下载到本地计算机(后续再想办法上传到服务器)
/// </summary>
/// <param name="starttime"></param>
/// <param name="endtime"></param>
/// <returns></returns>
public static VideoDataParamer GetVideoFile(VideoDataParamer data)
{
CHCNetSDK_X64.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK_X64.NET_DVR_DEVICEINFO_V30();
Int32 m_lDownHandle = -1;
Int32 m_lUserID = -1;
int[] iChannelNum = new int[96];
uint errorCode;
bool m_bInitSDK = false;
CHCNetSDK_X64.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40 = new CHCNetSDK_X64.NET_DVR_IPPARACFG_V40();
CHCNetSDK_X64.NET_DVR_GET_STREAM_UNION m_unionGetStream;
CHCNetSDK_X64.NET_DVR_IPCHANINFO m_struChanInfo;
VideoDataParamer refdata = new VideoDataParamer();
try
{
m_bInitSDK = CHCNetSDK_X64.NET_DVR_Init();
if (m_bInitSDK == false)
{
throw new Exception("初始化失败");
}
else
{
//保存SDK日志
CHCNetSDK_X64.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
}
var Url = data.url;
var Port = data.port;
var User = data.user;
var Password = data.password;
m_lUserID = CHCNetSDK_X64.NET_DVR_Login_V30(Url, Port, User, Password, ref DeviceInfo);
if (m_lUserID < 0)
{
errorCode = CHCNetSDK_X64.NET_DVR_GetLastError();
flag = false;
throw new Exception("登录失败,错误代码:" + errorCode+"URl"+ Url+ "Port" + Port + "User" + User + "Password" + Password);
}
else
{
//ExceptionLogHelper.WriteLog("登录成功");
uint dwAChanTotalNum = (uint)DeviceInfo.byChanNum;
uint dwDChanTotalNum = (uint)DeviceInfo.byIPChanNum + 256 * (uint)DeviceInfo.byHighDChanNum;
if (dwDChanTotalNum > 0)
{
// 获取通道
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_X64.NET_DVR_GetDVRConfig(m_lUserID, CHCNetSDK_X64.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
{
errorCode = CHCNetSDK_X64.NET_DVR_GetLastError();
throw new Exception("获取IP资源配置信息失败,错误代码:" + errorCode);
}
else
{
// 获取通道成功
m_struIpParaCfgV40 = (CHCNetSDK_X64.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK_X64.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_X64.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK_X64.NET_DVR_IPCHANINFO));
Marshal.FreeHGlobal(ptrChanInfo);
break;
default:
break;
}
}
}
}
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_X64.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK_X64.NET_DVR_IPCHANINFO));
if (m_struChanInfo.byIPID == 0) { throw new Exception("当前通道为空状态,请检查摄像头硬件"); } //通道状态判断,不能为空闲状态
CHCNetSDK_X64.NET_DVR_PLAYCOND struDownPara = new CHCNetSDK_X64.NET_DVR_PLAYCOND();
struDownPara.dwChannel = (uint)data.channel;
//设置下载的开始时间 Set the starting time
struDownPara.struStartTime.dwYear = (uint)data.starttime.Year;
struDownPara.struStartTime.dwMonth = (uint)data.starttime.Month;
struDownPara.struStartTime.dwDay = (uint)data.starttime.Day;
struDownPara.struStartTime.dwHour = (uint)data.starttime.Hour;
struDownPara.struStartTime.dwMinute = (uint)data.starttime.Minute;
struDownPara.struStartTime.dwSecond = (uint)data.starttime.Second;
//设置下载的结束时间 Set the stopping time
struDownPara.struStopTime.dwYear = (uint)data.endtime.Year;
struDownPara.struStopTime.dwMonth = (uint)data.endtime.Month;
struDownPara.struStopTime.dwDay = (uint)data.endtime.Day;
struDownPara.struStopTime.dwHour = (uint)data.endtime.Hour;
struDownPara.struStopTime.dwMinute = (uint)data.endtime.Minute;
struDownPara.struStopTime.dwSecond = (uint)data.endtime.Second;
//录像文件保存路径和文件名
string sVideoFileName = data.name;
m_lDownHandle = CHCNetSDK_X64.NET_DVR_GetFileByTime_V40(m_lUserID, sVideoFileName, ref struDownPara);
if (m_lDownHandle < 0)
{
errorCode = CHCNetSDK_X64.NET_DVR_GetLastError();
refdata.errorInfo = errorCode.ToString();
throw new Exception("开始下载失败,错误代码:" + errorCode);
}
uint iOutValue = 0;
if (!CHCNetSDK_X64.NET_DVR_PlayBackControl_V40(m_lDownHandle, CHCNetSDK_X64.NET_DVR_PLAYSTART, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue))
{
errorCode = CHCNetSDK_X64.NET_DVR_GetLastError();
refdata.errorInfo = errorCode.ToString();
throw new Exception("下载进度获取失败,错误代码:" + errorCode); //下载控制失败,输出错误号
}
int iPos = 0;
refdata.starttime = DateTime.Now;
//ExceptionLogHelper.WriteLog(string.Format("开始下载通道{0}文件", struDownPara.dwChannel));
while (iPos != 100) //等待下载完成
{
//获取下载进度
iPos = CHCNetSDK_X64.NET_DVR_GetDownloadPos(m_lDownHandle);
if (iPos == 200)
{
refdata.errorInfo = "网络异常,下载失败";
throw new Exception("网络异常,下载失败");
}
}
if (!CHCNetSDK_X64.NET_DVR_StopGetFile(m_lDownHandle))
{
errorCode = CHCNetSDK_X64.NET_DVR_GetLastError();
refdata.errorInfo = errorCode.ToString();
throw new Exception("下载停止失败,错误代码:" + errorCode); //下载控制失败,输出错误号
}
else
{
refdata.endtime = DateTime.Now;
m_lDownHandle = -1;
if (File.Exists(data.name))
{
//ExceptionLogHelper.WriteLog("下载成功");
refdata.errorInfo = "下载成功";
refdata.status = true;
}
}
return refdata;
}
}
}
catch (Exception e)
{
refdata.errorInfo = e.Message;
refdata.status = false;
return refdata;
}
return refdata;
}
CHCNetSDK文件最好是去官方找下,试了下代码量较大,上传失败。。。。
CHCNetSDK下载地址:https://download.csdn.net/download/chenwei0731/13158376