zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Unity3d C#通过使用大华SDK控制大华摄像头旋转、变焦等云台操作和预置点等控制操作(含源码)

c#控制源码SDK 操作 通过 Unity3D 旋转
2023-09-27 14:27:29 时间

前言

本文的内容和在之前我写过Unity3d C# 接入海康威视摄像头SDK实现接口控制功能(如:控制云台)的文章基本类似,同样是通过官网提供的SDK进行开发,只不过针对的设备不同,和部分实现细节不同。但是也要看自己的设备是否支持某些操作,如枪机肯定不支持旋转等操作。

准备工作

下载SDK

首先是前往官网下载SDK(https://www.dahuatech.com/service/downloadlists/836.html),一般是选择windows平台的类似“设备网络SDK_CSharp_Win**”,因为Unity3d内使用,所以选择C#语言的。

目录

\libs 目录下全是库文件,dll动态链接库文件,开发工程需要引用的。

\Doc 是说明文档,如果开发过程中有不明白的可以打开“NetSDK_C#编程指导手册.pdf”进行搜索查看说明。

\Demos 这个目录全是Visual Studio的窗体程序,如果您是要进行C#的窗体程序开发,则不用往下看了,因为下面的内容是针对Unity3d开发的,你直接参考该目录下Demo进行开发即可。

Unity3d工程

首先需要将\libs下的文件复制一份放到工程的Plugins文件夹下,如果没有自建一个。
然后打开一个demo工程,将“NetSDKStruct.cs”、“NetSDK.cs”和“OriginalSDK.cs”脚本放到unity工程下,这些脚本是SDK接口入口脚本。

云台实现

云台控制整个完整的流程如下图:

在这里插入图片描述

下面就按步骤实现。

初始化

   m_ReConnectCallBack = new fHaveReConnectCallBack(ReConnectCallBack);
   bool isInited = NETClient.Init(m_DisConnectCallBack, IntPtr.Zero, null);
   NETClient.SetAutoReconnect(m_ReConnectCallBack, IntPtr.Zero);

以上是初始化了SDK,同时设置了自动重连的回调函数。

登录设备

       if (!isInited)
        {
            UnityEngine.Debug.Log("初始化失败!:" + NETClient.GetLastError());
        }
        else
        {
            UnityEngine.Debug.Log("初始化成功!");
            m_DeviceInfo = new NET_DEVICEINFO_Ex();
            m_LoginID = NETClient.LoginWithHighLevelSecurity(CamIP, CamPort, CamUser, CamPswd, EM_LOGIN_SPAC_CAP_TYPE.TCP, IntPtr.Zero, ref m_DeviceInfo);
            if (IntPtr.Zero == m_LoginID)
            {
                UnityEngine.Debug.Log("登录相机失败!:" + NETClient.GetLastError());
                return;
            }
            else
                UnityEngine.Debug.Log("登录相机成功!:" + m_LoginID);
          }

登录前判定初始化是否成功,登录时将IP、端口、账号和密码等传参接口进行登录,返回用户ID,这个需要保存,后续接口调用需要使用。

云台控制

接口主要参数如下图:

在这里插入图片描述

该接口参数EM_EXTPTZ_ControlType 操作类型有很多,请自行查看接口使用。


        bool ret = NETClient.PTZControl(m_LoginID, 0, type, param1, param2, 0, isStop, IntPtr.Zero);
        if (!ret)
        {
            UnityEngine.Debug.Log("云台控制失败:" + NETClient.GetLastError());
        }else
            UnityEngine.Debug.Log("云台控制:" + type.ToString()+(isStop?"结束":"开始"));

该接口就需要用到登录的返回结果m_LoginID(用户ID),其中isStop是在云台停止标志。对云台八方向操作及镜头操作命令有效,进 行其他操作时,本参数应填充false。如在右旋转( EM_EXTPTZ_ControlType.RIGHT_CONTROL)时,发送isStop是true,当要停止时需要调用接口发送isStop是false,如果不发false,没有其他命令时,它会一直旋转。

登出/注销

NETClient.Logout(m_LoginID);
m_LoginID = IntPtr.Zero;

只需传入m_LoginID即可.

释放SDK

NETClient.Cleanup();

这一步一定要调用,最好将Logout和Cleanup放OnApplicationQuit函数里判断后处理一次。

其他接口

其他接口可以参考文档或者NetSDK.cs脚本。

查询设备状态

public static bool QueryDevState(IntPtr lLoginID, EM_DEVICE_STATE nType, ref object obj, Type typeName, int waittime);

直接获取远程设备连接状态,每个通道单独获取。EM_DEVICE_STATE的类型有很多种,通过改变类型该接口可查询很多信息,如普通报警状态、录象状态、硬盘信息、SD卡信息、设备支持的接入平台、获取当前云台的预置点列表和刻录会话总数等。

远程抓图

public static bool SnapPictureEx(IntPtr lLoginID, NET_SNAP_PARAMS par, IntPtr reserved);

保存监视视频到文件

 public static bool SaveRealData(IntPtr lRealHandle, string pchFileName);

实时预览

public static IntPtr RealPlay(IntPtr lLoginID, int nChannelID, IntPtr hWnd, EM_RealPlayType rType = EM_RealPlayType.Realplay);

对接该接口可能需要额外操作,还是建议用播放直播流插件播放rtmp流的形式。