一、前言
海康威视桌面板开发,追求简单快捷高效可选择Winform进行开发,追求界面好看当然自然需要选择WPF进行开发,WPF在布局也界面效果展示上面可以做的很漂亮。
WPF 和 Winform 开发类似,基本流程都是:1、海康SDK初始化;2、账号密码登录海康设备;3、传递画面播放句柄打开预览;
Winform中通常使用 PictureBox 组件进行画面播放,但是WPF中没有这个组件,通常做法是采用 WPF内嵌一个Winrom的PictureBox组件;
测试环境:VS2019+WPF+.Net Framework
1、界面布局准备:
创建好后直接添加控件
<Grid>
<WindowsFormsHost HorizontalAlignment="Left" Height="206" Margin="309,125,0,0"VerticalAlignment="Top" Width="306">
<wf:PictureBox x:Name="RealPlayWnd" />
</WindowsFormsHost>
</Grid>
2、海康威视SDK初始化:
需要去官网下载海康SDK(若干Dll文件):
需要引用SDK各种方法的C#封装类CHCNetSDK.cs:
添加到项目中方便使用,注意代码中Dll引用路径要对 [DllImport(@“HKWSDLL\HCNetSDK.dll”)]
海康SDK初始化(必须初始化成功才能进入下一步)
下面代码加在窗体加载事件中
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
//LogHelper.WriteLog("初始化失败", null);
return;
}
如果一直初始化失败,右击项目属性=>生成给首选32位这个勾勾取消
3、登录设备代码:
private void Loginuser(object sender, System.EventArgs e)
{
if (dtConfig.Rows[0]["textBoxIP"].ToString() == "" || dtConfig.Rows[0]["textBoxPort"].ToString() == "" ||
dtConfig.Rows[0]["textBoxUserName"].ToString() == "" || dtConfig.Rows[0]["textBoxPassword"].ToString() == "")
{
//LogHelper.WriteLog("摄像头配置信息不能为空", null);
return;
}
if (m_lUserID < 0)
{
struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();
//设备IP地址或者域名
byte[] byIP = System.Text.Encoding.Default.GetBytes(dtConfig.Rows[0]["textBoxIP"].ToString());
struLogInfo.sDeviceAddress = new byte[129];
byIP.CopyTo(struLogInfo.sDeviceAddress, 0);
//设备用户名
byte[] byUserName = System.Text.Encoding.Default.GetBytes(dtConfig.Rows[0]["textBoxUserName"].ToString());
struLogInfo.sUserName = new byte[64];
byUserName.CopyTo(struLogInfo.sUserName, 0);
//设备密码
byte[] byPassword = System.Text.Encoding.Default.GetBytes(dtConfig.Rows[0]["textBoxPassword"].ToString());
struLogInfo.sPassword = new byte[64];
byPassword.CopyTo(struLogInfo.sPassword, 0);
struLogInfo.wPort = ushort.Parse(dtConfig.Rows[0]["textBoxPort"].ToString());//设备服务端口号
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)
{
RealPlayWnd.Width = 0;
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
str = "NET_DVR_Login_V40 failed, error code= " + iLastErr; //登录失败,输出错误号
//LogHelper.WriteLog(str, null);
return;
}
else
{
RealPlayWnd.Width = 260;
//登录成功
//LogHelper.WriteLog("登录YES");
}
}
return;
}
4、加载事件代码:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
//读取配置文件
xmlTool = new XmlHelper(System.Environment.CurrentDirectory + "\\DeviceConfig.xml");
dtConfig = xmlTool.GetData("Activity");
string labRoomName = dtConfig.Rows[0]["venuename"].ToString();
string labRoomNum= dtConfig.Rows[0]["subsidiary"].ToString();
//初始化SDK
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
//LogHelper.WriteLog("初始化失败", null);
return;
}
int a = 0;
Loginuser(null, null);//调用登录
VideoStart(null, null);//调用视频预览
}
catch (Exception ex)
{
//LogHelper.WriteLog(ex.Message, ex);
// if (comm1.IsOpen)
// comm1.Close();
}
}
5、开启预览:注意画面播放句柄
private void VideoStart(object sender, System.EventArgs e)
{
if (m_lUserID < 0)
{
RealPlayWnd.Width = 0;
//LogHelper.WriteLog("未登录成功,配置信息错误!", null);
return;
}
if (m_lRealHandle < 0)
{
CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.hPlayWnd = RealPlayWnd.Handle; ;//预览窗口
lpPreviewInfo.lChannel = 1;//预te览的设备通道
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 = 1; //播放库播放缓冲区最大缓冲帧数
lpPreviewInfo.byProtoType = 0;
lpPreviewInfo.byPreviewMode = 0;
IntPtr pUser = new IntPtr();//用户数据
//打开预览 Start live view
m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, pUser);
if (m_lRealHandle < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
str = "NET_DVR_RealPlay_V40 failed, error code= " + iLastErr; //预览失败,输出错误号
//LogHelper.WriteLog(str, null);
return;
}
else
{
RealPlayWnd.Width = 260;
//预览成功
//LogHelper.WriteLog("预览YES");
}
}
return;
}
由于这里是使用读XML的形式给登录设备设置参数,所以XML代码也放一份吧
<?xml version="1.0" encoding="utf-8" ?>
<Activity>
<!--场馆名称-->
<venuename>六安市文化馆</venuename>
<!--场馆附加名称-->
<subsidiary>活动教室1</subsidiary>
<!--场馆编号-->
<venuecode>5ea167990cc40712c340acfa</venuecode>
<!--设备序号-->
<device>QF4</device>
<!--程序全屏显示需把电脑分辨率设置成1366*768-->
<!--活动轮播图片-->
<urladdress>http://www.luanwhg.cn/door/plate/getBanner</urladdress>
<!--活动信息-->
<urladdrest>http://www.luanwhg.cn/door/plate/getResult</urladdrest>
<!--验票接口-->
<urlcheckin>http://www.luanwhg.cn/door/plate/checkIn</urlcheckin>
<!--默认本地图片-->
<defaultimg>\\pic\\default.png</defaultimg>
<!--摄像头参数-->
<!--1.IP地址-->
<textBoxIP>192.168.7.230</textBoxIP>
<!--2.端口号-->
<textBoxPort>8000</textBoxPort>
<!--3.用户账号-->
<textBoxUserName>admin</textBoxUserName>
<!--4.用户密码-->
<textBoxPassword>dicos123</textBoxPassword>
<!--设备串口号-->
<com>COM1</com>
<!--端口号-->
<port>115200</port>
<!--是否考勤-->
<yesORno>yes</yesORno>
<!--开机机时间-->
<wakeup>08:30:00</wakeup>
<!--关机时间/-->
<onhook>22:00:00</onhook>
</Activity>
大概的流程就是这样。XML文件也要跟dll文件放在一起加载
最终效果图