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);
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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();
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        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;
            }
        }
Exemple #6
0
        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;
                }
            }
        }
Exemple #7
0
        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;
            }
        }
Exemple #10
0
        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";
            }
        }
Exemple #11
0
        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
            }
        }
Exemple #12
0
        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);
        }