一、前言
海康威视桌面板开发,追求简单快捷高效可选择Winform进行开发,追求界面好看当然自然需要选择WPF进行开发,WPF在布局也界面效果展示上面可以做的很漂亮。

WPF 和 Winform 开发类似,基本流程都是:1、海康SDK初始化;2、账号密码登录海康设备;3、传递画面播放句柄打开预览;

Winform中通常使用 PictureBox 组件进行画面播放,但是WPF中没有这个组件,通常做法是采用 WPF内嵌一个Winrom的PictureBox组件;

测试环境:VS2019+WPF+.Net Framework

1、界面布局准备:

unity 海康威视摄像头sdk demo c#海康威视摄像头_c#

创建好后直接添加控件

<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位这个勾勾取消

unity 海康威视摄像头sdk demo c#海康威视摄像头_sdk_02

 

 

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文件放在一起加载

最终效果图

unity 海康威视摄像头sdk demo c#海康威视摄像头_sdk_03