331 lines
15 KiB
C#
331 lines
15 KiB
C#
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-码流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;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|