2025-03-28 09:49:56 +08:00

331 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
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<object> NVRChanList = new List<object>();
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<string, object>
{
{"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<string, int>();
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-码流33-码流4以此类推
lpPreviewInfo.dwLinkMode = 0;//连接方式0- TCP方式1- UDP方式2- 多播方式3- RTP方式4-RTP/RTSP5-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;
}
}
}
}
}