using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace BaiduTracking { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { private Int32 i = 0; private uint iLastErr = 0; private Int32 m_lUserID = -1; private bool m_bInitSDK = false; private int[] iIPDevID = new int[96]; private int[] iChannelNum = new int[96]; private Int32 m_lRealHandle = -1; public string MonitorIp = ""; public string MonitorProt = ""; public string MonitorUserName = ""; public string MonitorPwd = ""; private uint dwAChanTotalNum = 0; private uint dwDChanTotalNum = 0; public CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo; public CHCNetSDK.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40; public CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo; public CHCNetSDK.NET_DVR_PU_STREAM_URL m_struStreamURL; public CHCNetSDK.NET_DVR_IPCHANINFO_V40 m_struChanInfoV40; private bool m_bRecord = false; private bool m_bTalk = false; private int lVoiceComHandle = -1; private string str; CHCNetSDK.REALDATACALLBACK RealData = null; CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = null; public CHCNetSDK.NET_DVR_PTZPOS m_struPtzCfg; public CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo; public delegate void UpdateTextStatusCallback(string strLogStatus, IntPtr lpDeviceInfo); public CHCNetSDK.NET_DVR_PICCFG_V40 m_piccfgV40; public string APP_ID { get; set; } public string API_KEY { get; set; } public string SECRET_KEY { get; set; } public Baidu.Aip.BodyAnalysis.Body BaiduAipClient { get; set; } List NVRChanList = new List(); public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { APP_ID = "24045911"; API_KEY = "zcHzMCd0lUGK9WXRlWl79iGL"; SECRET_KEY = "VG45PUqGIuZhB0keehEPGIxSzaQrqPyH"; BaiduAipClient = new Baidu.Aip.BodyAnalysis.Body(API_KEY, SECRET_KEY); BaiduAipClient.Timeout = 60000; // 修改超时时间 //if (MultimediaUtil.VideoInputDevices.Any()) //{ // mediaCapVideo.VideoCaptureDevice = MultimediaUtil.VideoInputDevices[0]; // mediaCapVideo.Play(); //} m_bInitSDK = CHCNetSDK.NET_DVR_Init(); string DVRIPAddress = "192.168.11.200"; //设备IP地址或者域名 Device IP Int16 DVRPortNumber = Int16.Parse("8000");//设备服务端口号 Device Port string DVRUserName = "admin";//设备登录用户名 User name to login string DVRPassword = "admin123";//设备登录密码 Password to login struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO(); //设备IP地址或者域名 byte[] byIP = System.Text.Encoding.Default.GetBytes(DVRIPAddress); struLogInfo.sDeviceAddress = new byte[129]; byIP.CopyTo(struLogInfo.sDeviceAddress, 0); //设备用户名 byte[] byUserName = System.Text.Encoding.Default.GetBytes(DVRUserName); struLogInfo.sUserName = new byte[64]; byUserName.CopyTo(struLogInfo.sUserName, 0); //设备密码 byte[] byPassword = System.Text.Encoding.Default.GetBytes(DVRPassword); struLogInfo.sPassword = new byte[64]; byPassword.CopyTo(struLogInfo.sPassword, 0); struLogInfo.wPort = ushort.Parse("8000");//设备服务端口号 if (LoginCallBack == null) { LoginCallBack = new CHCNetSDK.LOGINRESULTCALLBACK(cbLoginCallBack);//注册回调函数 } struLogInfo.cbLoginResult = LoginCallBack; struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40(); //登录设备 Login the device m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo); if (m_lUserID < 0) { iLastErr = CHCNetSDK.NET_DVR_GetLastError(); } else { dwAChanTotalNum = (uint)DeviceInfo.struDeviceV30.byChanNum; dwDChanTotalNum = (uint)DeviceInfo.struDeviceV30.byIPChanNum + 256 * (uint)DeviceInfo.struDeviceV30.byHighDChanNum; if (dwDChanTotalNum > 0) { InfoIPChannel(); } else { for (i = 0; i < dwAChanTotalNum; i++) { iChannelNum[i] = i + (int)DeviceInfo.struDeviceV30.byStartChan; } } ComboBox_Name.ItemsSource = NVRChanList; ComboBox_Name.DisplayMemberPath = "Name"; ComboBox_Name.SelectedValuePath = "Value"; } } public void cbLoginCallBack(int lUserID, int dwResult, IntPtr lpDeviceInfo, IntPtr pUser) { string strLoginCallBack = "登录设备,lUserID:" + lUserID + ",dwResult:" + dwResult; if (dwResult == 0) { uint iErrCode = CHCNetSDK.NET_DVR_GetLastError(); strLoginCallBack = strLoginCallBack + ",错误号:" + iErrCode; } ////下面代码注释掉也会崩溃 //if (InvokeRequired) //{ // object[] paras = new object[2]; // paras[0] = strLoginCallBack; // paras[1] = lpDeviceInfo; // // labelLogin.BeginInvoke(new UpdateTextStatusCallback(UpdateClientList), paras); //} //else //{ // //创建该控件的主线程直接更新信息列表 // // UpdateClientList(strLoginCallBack, lpDeviceInfo); //} } private void Button_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog(); openFileDialog.Filter = "png文件(.png)|*.png|所有文件|*.*"; if (openFileDialog.ShowDialog() == true) { var image = File.ReadAllBytes(openFileDialog.FileName); switch (((Button)sender).Name) { case "btn_Face": default: // 如果有可选参数 var dynamic = "true"; // 调用人流量统计-动态版,可能会抛出网络等异常,请使用try/catch捕获 var result = BaiduAipClient.BodyTracking(image, "false"); Console.WriteLine(result); // 如果有可选参数 var options = new Dictionary { {"case_id", 1312653213}, {"case_init", "1312653213"}, {"show", "true"}, {"area", "1,1,719,1,719,719,1,719"} }; // 带参数调用人流量统计-动态版 result = BaiduAipClient.BodyTracking(image, dynamic, options); txt_Result.Text = result.ToString(); break; } } } private void picVideo_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) { } public void InfoIPChannel() { 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; //该Demo仅获取第一组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)) { iLastErr = CHCNetSDK.NET_DVR_GetLastError(); } else { m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40)); for (i = 0; i < dwAChanTotalNum; i++) { iChannelNum[i] = i + (int)DeviceInfo.struDeviceV30.byStartChan; } byte byStreamType = 0; uint iDChanNum = 64; if (dwDChanTotalNum < 64) { iDChanNum = dwDChanTotalNum; //如果设备IP通道小于64路,按实际路数获取 } //_PassageWay = new Dictionary(); for (i = 0; i < iDChanNum; i++) { iChannelNum[i + dwAChanTotalNum] = i + (int)m_struIpParaCfgV40.dwStartDChan; byStreamType = m_struIpParaCfgV40.struStreamMode[i].byGetStreamType; dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[i].uGetStream); switch (byStreamType) { //目前NVR仅支持直接从设备取流 NVR supports only the mode: get stream from device directly case 0: IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize); Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfo, false); m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO)); DictoryAdd(i, m_struChanInfo.byEnable, m_struChanInfo.byIPID); //列出IP通道 List the IP channel iIPDevID[i] = m_struChanInfo.byIPID + m_struChanInfo.byIPIDHigh * 256 - iGroupNo * 64 - 1; Marshal.FreeHGlobal(ptrChanInfo); break; case 4: IntPtr ptrStreamURL = Marshal.AllocHGlobal((Int32)dwSize); Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrStreamURL, false); m_struStreamURL = (CHCNetSDK.NET_DVR_PU_STREAM_URL)Marshal.PtrToStructure(ptrStreamURL, typeof(CHCNetSDK.NET_DVR_PU_STREAM_URL)); DictoryAdd(i, m_struStreamURL.byEnable, m_struStreamURL.wIPID); iIPDevID[i] = m_struStreamURL.wIPID - iGroupNo * 64 - 1; Marshal.FreeHGlobal(ptrStreamURL); break; case 6: IntPtr ptrChanInfoV40 = Marshal.AllocHGlobal((Int32)dwSize); Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfoV40, false); m_struChanInfoV40 = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40)); DictoryAdd(i, m_struChanInfoV40.byEnable, m_struChanInfoV40.wIPID); iIPDevID[i] = m_struChanInfoV40.wIPID - iGroupNo * 64 - 1; Marshal.FreeHGlobal(ptrChanInfoV40); break; default: break; } } } Marshal.FreeHGlobal(ptrIpParaCfgV40); } private void DictoryAdd(int Index, byte byOnline, int byIPID) { uint dwReturns = 0; uint dwSize1 = (uint)Marshal.SizeOf(m_piccfgV40); IntPtr ptrPicCigV40 = Marshal.AllocHGlobal((Int32)dwSize1); Marshal.StructureToPtr(m_piccfgV40, ptrPicCigV40, false); //int aaa = (int)iChannelNum[(int)iSelIndex]; int iChannel = iChannelNum[Index]; if (!CHCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, CHCNetSDK.NET_DVR_GET_PICCFG_V40, iChannel, ptrPicCigV40, dwSize1, ref dwReturns)) { iLastErr = CHCNetSDK.NET_DVR_GetLastError(); } m_piccfgV40 = (CHCNetSDK.NET_DVR_PICCFG_V40)Marshal.PtrToStructure(ptrPicCigV40, typeof(CHCNetSDK.NET_DVR_PICCFG_V40)); string strs = Encoding.Default.GetString(m_piccfgV40.sChanName); strs = strs.Replace('\0', ' '); NVRChanList.Add(new { Name = strs.Trim(), Value = iChannel }); Marshal.FreeHGlobal(ptrPicCigV40); } private void ComboBox_Name_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (m_lRealHandle >= 0) { if (!CHCNetSDK.NET_DVR_StopRealPlay(m_lRealHandle)) { uint iLastErr = CHCNetSDK.NET_DVR_GetLastError(); return; } m_lRealHandle = -1; } if (m_lRealHandle < 0) { CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO(); lpPreviewInfo.hPlayWnd = picVideo.Handle;//预览窗口 live view window lpPreviewInfo.lChannel = int.Parse(ComboBox_Name.SelectedValue.ToString());//预览的设备通道 the device channel number lpPreviewInfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推 lpPreviewInfo.dwLinkMode = 0;//连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP lpPreviewInfo.bBlocked = true; //0- 非阻塞取流,1- 阻塞取流 lpPreviewInfo.dwDisplayBufNum = 15; //播放库显示缓冲区最大帧数 IntPtr pUser = IntPtr.Zero;//用户数据 user data //打开预览 Start live view m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser); if (m_lRealHandle < 0) { uint Last = CHCNetSDK.NET_DVR_GetLastError(); return; } } } } }