private void btnDel_Click(object sender, EventArgs e) { if (IpDevIndex < 0) { return; //该通道未添加有设备,空闲状态 } MStruIpParaCfgV40.struStreamMode[ChanIndex].uGetStream.Init(); //初始化通道参数为0 MStruIpParaCfgV40.struIPDevInfo[IpDevIndex] = new ChcNetSdk.NetDvrIpdevinfoV31(); //初始化设备参数为0 var nSize = Marshal.SizeOf(MStruIpParaCfgV40); var ptrIpParaCfgV40 = Marshal.AllocHGlobal(nSize); Marshal.StructureToPtr(MStruIpParaCfgV40, ptrIpParaCfgV40, false); if (!ChcNetSdk.NET_DVR_SetDVRConfig(MlUserId, ChcNetSdk.NetDvrSetIpparacfgV40, 0, ptrIpParaCfgV40, (uint)nSize)) { var iLastErr = ChcNetSdk.NET_DVR_GetLastError(); var str = "NetDvrSetIpparacfgV40 failed, error code= " + iLastErr; MessageBox.Show(str); //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code } else { MessageBox.Show(@"IP通道删除成功!"); } Marshal.FreeHGlobal(ptrIpParaCfgV40); }
private void btnJPEG_Click(object sender, EventArgs e) { var lChannel = _iChannelNum[(int)_iSelIndex]; //通道号 Channel number var lpJpegPara = new ChcNetSdk.NetDvrJpegpara { wPicQuality = 0, wPicSize = 0xff }; //图像质量 Image quality //抓图分辨率 Picture size: 0xff-Auto(使用当前码流分辨率) //抓图分辨率需要设备支持,更多取值请参考SDK文档 //JPEG抓图保存成文件 Capture a JPEG picture var sJpegPicFileName = "filetest.jpg"; if (!ChcNetSdk.NET_DVR_CaptureJPEGPicture(_mLUserId, lChannel, ref lpJpegPara, sJpegPicFileName)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_CaptureJPEGPicture failed, error code= " + _iLastErr; DebugInfo(_str); return; } _str = "NET_DVR_CaptureJPEGPicture succ and the saved file is " + sJpegPicFileName; DebugInfo(_str); //JEPG抓图,数据保存在缓冲区中 Capture a JPEG picture and save in the buffer uint iBuffSize = 400000; //缓冲区大小需要不小于一张图片数据的大小 The buffer size should not be less than the picture size var byJpegPicBuffer = new byte[iBuffSize]; uint dwSizeReturned = 0; if (!ChcNetSdk.NET_DVR_CaptureJPEGPicture_NEW(_mLUserId, lChannel, ref lpJpegPara, byJpegPicBuffer, iBuffSize, ref dwSizeReturned)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_CaptureJPEGPicture_NEW failed, error code= " + _iLastErr; DebugInfo(_str); } else { //将缓冲区里的JPEG图片数据写入文件 save the data into a file var str = "buffertest.jpg"; var fs = new FileStream(str, FileMode.Create); var iLen = (int)dwSizeReturned; fs.Write(byJpegPicBuffer, 0, iLen); fs.Close(); str = "NET_DVR_CaptureJPEGPicture_NEW succ and save the data in buffer to 'buffertest.jpg'."; DebugInfo(str); } }
private void btn_Exit_Click(object sender, EventArgs e) { //停止预览 if (_mLRealHandle >= 0) { ChcNetSdk.NET_DVR_StopRealPlay(_mLRealHandle); _mLRealHandle = -1; } //注销登录 if (_mLUserId >= 0) { ChcNetSdk.NET_DVR_Logout(_mLUserId); _mLUserId = -1; } ChcNetSdk.NET_DVR_Cleanup(); Application.Exit(); }
/// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (_mLRealHandle >= 0) { ChcNetSdk.NET_DVR_StopRealPlay(_mLRealHandle); } if (_mLUserId >= 0) { ChcNetSdk.NET_DVR_Logout(_mLUserId); } if (_mBInitSdk == true) { ChcNetSdk.NET_DVR_Cleanup(); } if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); }
private void btnRecord_Click(object sender, EventArgs e) { //录像保存路径和文件名 the path and file name to save var sVideoFileName = "test.mp4"; if (_mBRecord == false) { //强制I帧 Make one Key frame var lChannel = _iChannelNum[(int)_iSelIndex]; //通道号 Channel number ChcNetSdk.NET_DVR_MakeKeyFrame(_mLUserId, lChannel); //开始录像 Start recording if (!ChcNetSdk.NET_DVR_SaveRealData(_mLRealHandle, sVideoFileName)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_SaveRealData failed, error code= " + _iLastErr; DebugInfo(_str); return; } DebugInfo("NET_DVR_SaveRealData succ!"); btnRecord.Text = @"Stop"; _mBRecord = true; } else { //停止录像 Stop recording if (!ChcNetSdk.NET_DVR_StopSaveRealData(_mLRealHandle)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_StopSaveRealData failed, error code= " + _iLastErr; DebugInfo(_str); return; } _str = "NET_DVR_StopSaveRealData succ and the saved file is " + sVideoFileName; DebugInfo(_str); btnRecord.Text = @"Record"; _mBRecord = false; } }
public VedioForm() { InitializeComponent(); _mBInitSdk = ChcNetSdk.NET_DVR_Init(); if (_mBInitSdk == false) { MessageBox.Show(@"NET_DVR_Init error!"); } else { //保存SDK日志 To save the SDK log ChcNetSdk.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true); comboBoxView.SelectedIndex = 0; for (var i = 0; i < 64; i++) { _iIpDevId[i] = -1; _iChannelNum[i] = -1; } } }
private void btnBMP_Click(object sender, EventArgs e) { if (_mLRealHandle < 0) { DebugInfo("Please start live view firstly!"); //BMP抓图需要先打开预览 return; } //图片保存路径和文件名 the path and file name to save const string sBmpPicFileName = "test.bmp"; //BMP抓图 Capture a BMP picture if (!ChcNetSdk.NET_DVR_CapturePicture(_mLRealHandle, sBmpPicFileName)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_CapturePicture failed, error code= " + _iLastErr; DebugInfo(_str); } else { _str = "NET_DVR_CapturePicture succ and the saved file is " + sBmpPicFileName; DebugInfo(_str); } }
private void btnSet_Click(object sender, EventArgs e) { /*********************************************************** * 添加IP通道或者修改IP通道配置 * **********************************************************/ if (IpDevIndex < 0) { //如果该IP通道空闲,新增IP通道,选择空闲设备ID for (var i = 0; i < 64; i++) { if (MStruIpParaCfgV40.struIPDevInfo[i].byEnable == 0) { IpDevIndex = i; break; } } } MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].byEnable = 1;//该IP设备是否启用 //设备(厂家)协议类型,通过NET_DVR_GetIPCProtoList获取 MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].byProType = (byte)_mStruProtoList.struProto[comboBoxFactory.SelectedIndex].dwType; MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].struIP.sIpV4 = textBoxIPAddr.Text; //前端设备IP地址 MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].wDVRPort = ushort.Parse(textBoxPort.Text); //前端设备端口 MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].sUserName = textBoxUserName.Text; //前端设备用户名 MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].sPassword = textBoxPsw.Text; //前端设备密码 switch (MStruIpParaCfgV40.struStreamMode[ChanIndex].byGetStreamType) { case 0: //直接从设备取流,对应联合体中结构NET_DVR_IPCHANINFO _mStruChanInfo.byEnable = 1; _mStruChanInfo.byIPID = Convert.ToByte((IpDevIndex + 1) % 256); _mStruChanInfo.byChannel = byte.Parse(textBoxChannel.Text); var ptrChanInfo = Marshal.AllocHGlobal((int)DwUnionSize); Marshal.StructureToPtr(_mStruChanInfo, ptrChanInfo, false); MStruIpParaCfgV40.struStreamMode[ChanIndex].uGetStream = (ChcNetSdk.NetDvrGetStreamUnion)Marshal.PtrToStructure(ptrChanInfo, typeof(ChcNetSdk.NetDvrGetStreamUnion)); Marshal.FreeHGlobal(ptrChanInfo); break; case 6: //直接从设备取流(扩展),对应联合体中结构NET_DVR_IPCHANINFO_V40 _mStruChanInfoV40.byEnable = 1; _mStruChanInfoV40.wIPID = Convert.ToUInt16(IpDevIndex + 1); _mStruChanInfoV40.dwChannel = Convert.ToUInt32(textBoxChannel.Text); _mStruChanInfoV40.byTransProtocol = (byte)comboBoxProtocol.SelectedIndex; _mStruChanInfoV40.byTransMode = (byte)comboBoxStream.SelectedIndex; var ptrChanInfoV40 = Marshal.AllocHGlobal((int)DwUnionSize); Marshal.StructureToPtr(_mStruChanInfoV40, ptrChanInfoV40, false); MStruIpParaCfgV40.struStreamMode[ChanIndex].uGetStream = (ChcNetSdk.NetDvrGetStreamUnion)Marshal.PtrToStructure(ptrChanInfoV40, typeof(ChcNetSdk.NetDvrGetStreamUnion)); Marshal.FreeHGlobal(ptrChanInfoV40); break; } var nSize = Marshal.SizeOf(MStruIpParaCfgV40); var ptrIpParaCfgV40 = Marshal.AllocHGlobal(nSize); Marshal.StructureToPtr(MStruIpParaCfgV40, ptrIpParaCfgV40, false); if (!ChcNetSdk.NET_DVR_SetDVRConfig(MlUserId, ChcNetSdk.NetDvrSetIpparacfgV40, 0, ptrIpParaCfgV40, (uint)nSize)) { var iLastErr = ChcNetSdk.NET_DVR_GetLastError(); var str = "NetDvrSetIpparacfgV40 failed, error code= " + iLastErr; MessageBox.Show(str); //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code } else { MessageBox.Show(Resources.IpChannelConfig_btnSet_Click_IP通道配置成功_); } Marshal.FreeHGlobal(ptrIpParaCfgV40); }
private void IPChannelConfig_Load(object sender, EventArgs e) { int i; //获取设备支持IPC协议列表 if (ChcNetSdk.NET_DVR_GetIPCProtoList(MlUserId, ref _mStruProtoList)) { for (i = 0; i < (int)_mStruProtoList.dwProtoNum; i++) { comboBoxFactory.Items.Add(_mStruProtoList.struProto[i].byDescribe); } } comboBoxStreamType.SelectedIndex = 0; comboBoxFactory.SelectedIndex = 0; comboBoxStream.SelectedIndex = 0; comboBoxProtocol.SelectedIndex = 0; /*********************************************************** * 显示当前IP通道配置 * **********************************************************/ if (IpDevIndex < 0) { //该通道未添加有设备,空闲状态 return; } comboBoxStreamType.SelectedIndex = MStruIpParaCfgV40.struStreamMode[ChanIndex].byGetStreamType; //取流方式 textBoxIPAddr.Text = MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].struIP.sIpV4; //前端设备IP地址 textBoxPort.Text = Convert.ToString(MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].wDVRPort); //前端设备端口 textBoxUserName.Text = MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].sUserName; //前端设备用户名 textBoxPsw.Text = MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].sPassword; //前端设备密码 for (i = 0; i < (int)_mStruProtoList.dwProtoNum; i++) { //设备(厂家)协议类型,通过NET_DVR_GetIPCProtoList获取 if (_mStruProtoList.struProto[i].dwType == MStruIpParaCfgV40.struIPDevInfo[IpDevIndex].byProType) { comboBoxFactory.SelectedIndex = i; } } switch (MStruIpParaCfgV40.struStreamMode[ChanIndex].byGetStreamType) { case 0: //直接从设备取流,对应联合体中结构NET_DVR_IPCHANINFO var ptrChanInfo = Marshal.AllocHGlobal((int)DwUnionSize); Marshal.StructureToPtr(MStruIpParaCfgV40.struStreamMode[ChanIndex].uGetStream, ptrChanInfo, false); _mStruChanInfo = (ChcNetSdk.NetDvrIpchaninfo)Marshal.PtrToStructure(ptrChanInfo, typeof(ChcNetSdk.NetDvrIpchaninfo)); textBoxChannel.Text = Convert.ToString(_mStruChanInfo.byChannel); Marshal.FreeHGlobal(ptrChanInfo); break; case 6: //直接从设备取流(扩展),对应联合体中结构NET_DVR_IPCHANINFO_V40 var ptrChanInfoV40 = Marshal.AllocHGlobal((int)DwUnionSize); Marshal.StructureToPtr(MStruIpParaCfgV40.struStreamMode[ChanIndex].uGetStream, ptrChanInfoV40, false); _mStruChanInfoV40 = (ChcNetSdk.NetDvrIpchaninfoV40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(ChcNetSdk.NetDvrIpchaninfoV40)); textBoxChannel.Text = Convert.ToString(_mStruChanInfoV40.dwChannel); comboBoxStream.SelectedIndex = _mStruChanInfoV40.byTransMode; comboBoxProtocol.SelectedIndex = _mStruChanInfoV40.byTransProtocol; Marshal.FreeHGlobal(ptrChanInfoV40); break; } }
private void btnLogin_Click(object sender, EventArgs e) { if (_mLUserId < 0) { var dvripAddress = textBoxIP.Text; //设备IP地址或者域名 Device IP var dvrPortNumber = short.Parse(textBoxPort.Text); //设备服务端口号 Device Port var dvrUserName = textBoxUserName.Text; //设备登录用户名 User name to login var dvrPassword = textBoxPassword.Text; //设备登录密码 Password to login //登录设备 Login the device _mLUserId = ChcNetSdk.NET_DVR_Login_V30(dvripAddress, dvrPortNumber, dvrUserName, dvrPassword, ref DeviceInfo); if (_mLUserId < 0) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_Login_V30 failed, error code= " + _iLastErr; //登录失败,输出错误号 Failed to login and output the error code DebugInfo(_str); } else { //登录成功 DebugInfo("NET_DVR_Login_V30 succ!"); btnLogin.Text = @"Logout"; _dwAChanTotalNum = DeviceInfo.byChanNum; if (DeviceInfo.byIPChanNum > 0) { InfoIpChannel(); } else { for (_i = 0; _i < _dwAChanTotalNum; _i++) { ListAnalogChannel(_i + 1, 1); _iChannelNum[_i] = _i + DeviceInfo.byStartChan; } comboBoxView.SelectedItem = 1; // MessageBox.Show("This device has no IP channel!"); } } } else { //注销登录 Logout the device if (_mLRealHandle >= 0) { DebugInfo("Please stop live view firstly"); //登出前先停止预览 Stop live view before logout return; } if (!ChcNetSdk.NET_DVR_Logout(_mLUserId)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_Logout failed, error code= " + _iLastErr; DebugInfo(_str); return; } DebugInfo("NET_DVR_Logout succ!"); listViewIPChannel.Items.Clear();//清空通道列表 Clean up the channel list _mLUserId = -1; btnLogin.Text = @"Login"; } }
private void btnPreview_Click(object sender, EventArgs e) { if (_mLUserId < 0) { MessageBox.Show(@"Please login the device firstly!"); return; } if (_mBRecord) { MessageBox.Show(@"Please stop recording firstly!"); return; } if (_mLRealHandle < 0) { var lpPreviewInfo = new ChcNetSdk.NetDvrPreviewinfo { hPlayWnd = RealPlayWnd.Handle, lChannel = _iChannelNum[(int)_iSelIndex], dwStreamType = 0, dwLinkMode = 0, bBlocked = true }; //预览窗口 live view window //预览的设备通道 the device channel number //码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推 //连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP //0- 非阻塞取流,1- 阻塞取流 var pUser = IntPtr.Zero;//用户数据 user data if (comboBoxView.SelectedIndex == 0) { //打开预览 Start live view _mLRealHandle = ChcNetSdk.NET_DVR_RealPlay_V40(_mLUserId, ref lpPreviewInfo, null /*RealData*/, pUser); } else { lpPreviewInfo.hPlayWnd = IntPtr.Zero; //预览窗口 live view window _mPtrRealHandle = RealPlayWnd.Handle; _realData = RealDataCallBack; //预览实时流回调函数 real-time stream callback function _mLRealHandle = ChcNetSdk.NET_DVR_RealPlay_V40(_mLUserId, ref lpPreviewInfo, _realData, pUser); } if (_mLRealHandle < 0) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_RealPlay_V40 failed, error code= " + _iLastErr; //预览失败,输出错误号 failed to start live view, and output the error code. DebugInfo(_str); } else { //预览成功 DebugInfo("NET_DVR_RealPlay_V40 succ!"); btnPreview.Text = @"Stop View"; } } else { //停止预览 Stop live view if (!ChcNetSdk.NET_DVR_StopRealPlay(_mLRealHandle)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NET_DVR_StopRealPlay failed, error code= " + _iLastErr; DebugInfo(_str); return; } if ((comboBoxView.SelectedIndex == 1) && (_mLPort >= 0)) { if (!PlayCtrl.PlayM4_Stop(_mLPort)) { _iLastErr = PlayCtrl.PlayM4_GetLastError(_mLPort); _str = "PlayM4_Stop failed, error code= " + _iLastErr; DebugInfo(_str); } if (!PlayCtrl.PlayM4_CloseStream(_mLPort)) { _iLastErr = PlayCtrl.PlayM4_GetLastError(_mLPort); _str = "PlayM4_CloseStream failed, error code= " + _iLastErr; DebugInfo(_str); } if (!PlayCtrl.PlayM4_FreePort(_mLPort)) { _iLastErr = PlayCtrl.PlayM4_GetLastError(_mLPort); _str = "PlayM4_FreePort failed, error code= " + _iLastErr; DebugInfo(_str); } _mLPort = -1; } DebugInfo("NET_DVR_StopRealPlay succ!"); _mLRealHandle = -1; btnPreview.Text = @"Live View"; RealPlayWnd.Invalidate();//刷新窗口 refresh the window } }
public void InfoIpChannel() { var dwSize = (uint)Marshal.SizeOf(MStruIpParaCfgV40); var ptrIpParaCfgV40 = Marshal.AllocHGlobal((int)dwSize); Marshal.StructureToPtr(MStruIpParaCfgV40, ptrIpParaCfgV40, false); uint dwReturn = 0; var iGroupNo = 0; if (!ChcNetSdk.NET_DVR_GetDVRConfig(_mLUserId, ChcNetSdk.NetDvrGetIpparacfgV40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn)) { _iLastErr = ChcNetSdk.NET_DVR_GetLastError(); _str = "NetDvrGetIpparacfgV40 failed, error code= " + _iLastErr; //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code DebugInfo(_str); } else { DebugInfo("NetDvrGetIpparacfgV40 succ!"); MStruIpParaCfgV40 = (ChcNetSdk.NetDvrIpparacfgV40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(ChcNetSdk.NetDvrIpparacfgV40)); for (_i = 0; _i < _dwAChanTotalNum; _i++) { ListAnalogChannel(_i + 1, MStruIpParaCfgV40.byAnalogChanEnable[_i]); _iChannelNum[_i] = _i + DeviceInfo.byStartChan; } for (_i = 0; _i < MStruIpParaCfgV40.dwDChanNum; _i++) { _iChannelNum[_i + _dwAChanTotalNum] = _i + (int)MStruIpParaCfgV40.dwStartDChan; var byStreamType = MStruIpParaCfgV40.struStreamMode[_i].byGetStreamType; dwSize = (uint)Marshal.SizeOf(MStruIpParaCfgV40.struStreamMode[_i].uGetStream); switch (byStreamType) { //目前NVR仅支持直接从设备取流 NVR supports only the mode: get stream from device directly case 0: var ptrChanInfo = Marshal.AllocHGlobal((int)dwSize); Marshal.StructureToPtr(MStruIpParaCfgV40.struStreamMode[_i].uGetStream, ptrChanInfo, false); MStruChanInfo = (ChcNetSdk.NetDvrIpchaninfo)Marshal.PtrToStructure(ptrChanInfo, typeof(ChcNetSdk.NetDvrIpchaninfo)); //列出IP通道 List the IP channel ListIpChannel(_i + 1, MStruChanInfo.byEnable, MStruChanInfo.byIPID); _iIpDevId[_i] = MStruChanInfo.byIPID + MStruChanInfo.byIPIDHigh * 256 - iGroupNo * 64 - 1; Marshal.FreeHGlobal(ptrChanInfo); break; case 6: var ptrChanInfoV40 = Marshal.AllocHGlobal((int)dwSize); Marshal.StructureToPtr(MStruIpParaCfgV40.struStreamMode[_i].uGetStream, ptrChanInfoV40, false); MStruChanInfoV40 = (ChcNetSdk.NetDvrIpchaninfoV40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(ChcNetSdk.NetDvrIpchaninfoV40)); //列出IP通道 List the IP channel ListIpChannel(_i + 1, MStruChanInfoV40.byEnable, MStruChanInfoV40.wIPID); _iIpDevId[_i] = MStruChanInfoV40.wIPID - iGroupNo * 64 - 1; Marshal.FreeHGlobal(ptrChanInfoV40); break; } } } Marshal.FreeHGlobal(ptrIpParaCfgV40); }