通过对接海康SDK,获取视屏流回调。经过解码得到YUV格式的图片,最后通过Shader把YUV数据显示出来。
也可以通过Rtsp协议,直接获取视屏流显示。这个貌似Unity中已经有插件支持了,UMP。
------2018.4.20
using UnityEngine;
using System.Collections;
using System;
using UnityEngine.UI;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
//Frame Info
public struct FRAME_INFO
{
public int nWidth;
public int nHeight;
public int nStamp;
public int nType;
public int nFrameRate;
public uint dwFrameNum;
using System.Collections;
using System;
using UnityEngine.UI;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
//Frame Info
public struct FRAME_INFO
{
public int nWidth;
public int nHeight;
public int nStamp;
public int nType;
public int nFrameRate;
public uint dwFrameNum;
public void Init()
{
nWidth = 0;
nHeight = 0;
nStamp = 0;
nType = 0;
nFrameRate = 0;
dwFrameNum = 0;
}
}
public class HkVideo : MonoBehaviour {
// add by gb 080131 version 4.9.0.1
[DllImport("PlayCtrl")]
public static extern bool PlayM4_GetPort(ref int nPort);
[DllImport("PlayCtrl")]
public static extern uint PlayM4_GetLastError(int nPort);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetStreamOpenMode(int nPort, uint nMode);
//Stream type
public const int STREAME_REALTIME = 0;
public const int STREAME_FILE = 1;
[DllImport("PlayCtrl")]
public static extern bool PlayM4_OpenStream(int nPort, IntPtr pFileHeadBuf, uint nSize, uint nBufPoolSize);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetDisplayBuf(int nPort, uint nNum);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetOverlayMode(int nPort, int bOverlay, uint colorKey);
public delegate void DECCBFUN(int nPort, IntPtr pBuf, int nSize, ref FRAME_INFO pFrameInfo, int nReserved1, int nReserved2);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetDecCallBackEx(int nPort, DECCBFUN DecCBFun, IntPtr pDest, int nDestSize);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_Play(int nPort, IntPtr hWnd);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_InputData(int nPort, IntPtr pBuf, uint nSize);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetDecCallBack(int nPort, DECCBFUN DecCBFun);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_Stop(int nPort);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_CloseStream(int nPort);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_FreePort(int nPort);
{
nWidth = 0;
nHeight = 0;
nStamp = 0;
nType = 0;
nFrameRate = 0;
dwFrameNum = 0;
}
}
public class HkVideo : MonoBehaviour {
// add by gb 080131 version 4.9.0.1
[DllImport("PlayCtrl")]
public static extern bool PlayM4_GetPort(ref int nPort);
[DllImport("PlayCtrl")]
public static extern uint PlayM4_GetLastError(int nPort);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetStreamOpenMode(int nPort, uint nMode);
//Stream type
public const int STREAME_REALTIME = 0;
public const int STREAME_FILE = 1;
[DllImport("PlayCtrl")]
public static extern bool PlayM4_OpenStream(int nPort, IntPtr pFileHeadBuf, uint nSize, uint nBufPoolSize);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetDisplayBuf(int nPort, uint nNum);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetOverlayMode(int nPort, int bOverlay, uint colorKey);
public delegate void DECCBFUN(int nPort, IntPtr pBuf, int nSize, ref FRAME_INFO pFrameInfo, int nReserved1, int nReserved2);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetDecCallBackEx(int nPort, DECCBFUN DecCBFun, IntPtr pDest, int nDestSize);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_Play(int nPort, IntPtr hWnd);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_InputData(int nPort, IntPtr pBuf, uint nSize);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_SetDecCallBack(int nPort, DECCBFUN DecCBFun);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_Stop(int nPort);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_CloseStream(int nPort);
[DllImport("PlayCtrl")]
public static extern bool PlayM4_FreePort(int nPort);
private bool m_bInitSDK = false;
private bool m_bRecord = false;
private uint iLastErr = 0;
public Int32 m_lUserID = -1;
private Int32 m_lRealHandle = -1;
private string str;
private Int32 m_lPort = -1;
private IntPtr m_ptrRealHandle;
private int[] iIPDevID = new int[96];
private int[] iChannelNum = new int[96];
private bool m_bRecord = false;
private uint iLastErr = 0;
public Int32 m_lUserID = -1;
private Int32 m_lRealHandle = -1;
private string str;
private Int32 m_lPort = -1;
private IntPtr m_ptrRealHandle;
private int[] iIPDevID = new int[96];
private int[] iChannelNum = new int[96];
private CHCNetSDK.REALDATACALLBACK RealData = null;
public CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo;
public CHCNetSDK.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40;
public CHCNetSDK.NET_DVR_STREAM_MODE m_struStreamMode;
public CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo;
public CHCNetSDK.NET_DVR_IPCHANINFO_V40 m_struChanInfoV40;
private DECCBFUN m_fDisplayFun = null;
public delegate void MyDebugInfo(string str);
public CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo;
public CHCNetSDK.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40;
public CHCNetSDK.NET_DVR_STREAM_MODE m_struStreamMode;
public CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo;
public CHCNetSDK.NET_DVR_IPCHANINFO_V40 m_struChanInfoV40;
private DECCBFUN m_fDisplayFun = null;
public delegate void MyDebugInfo(string str);
int width = 352;//视屏的宽
int height = 288;//视屏的高
public bool isPlaying;
// Use this for initialization
void Start () {
InitSDK();
//InitVideoMaterial();
}
private bool isImgInit;
///// <summary>
///// 初始化RGB图像大小
///// </summary>
//private void InitImgSize()
//{
// imgSize = width * height;
// rgb = new byte[3 * imgSize];
//}
/// <summary>
/// 初始化,一次就行(初始化->登录->获取视屏流)
/// </summary>
private void InitSDK()
{
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
Debug.LogError("NET_DVR_Init error!");
return;
}
else
{
//保存SDK日志 To save the SDK log
CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
int height = 288;//视屏的高
public bool isPlaying;
// Use this for initialization
void Start () {
InitSDK();
//InitVideoMaterial();
}
private bool isImgInit;
///// <summary>
///// 初始化RGB图像大小
///// </summary>
//private void InitImgSize()
//{
// imgSize = width * height;
// rgb = new byte[3 * imgSize];
//}
/// <summary>
/// 初始化,一次就行(初始化->登录->获取视屏流)
/// </summary>
private void InitSDK()
{
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
Debug.LogError("NET_DVR_Init error!");
return;
}
else
{
//保存SDK日志 To save the SDK log
CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
//comboBoxView.SelectedIndex = 0;
for (int i = 0; i < 64; i++)
{
iIPDevID[i] = -1;
iChannelNum[i] = -1;
}
Debug.Log("Init Success!");
}
}
/// <summary>
/// 登录(初始化->登录->获取视屏流)
/// </summary>
/// <param name="Ip"></param>
/// <param name="Port"></param>
/// <param name="UserName"></param>
/// <param name="PassWord"></param>
/// <param name="action"></param>
public void Login(string Ip,string Port,string UserName,string PassWord,Action<bool>action=null)
{
if (m_lUserID < 0)
{
//JYHLoginVR JYHCamera = JYHLoginVR.Instance;
//string DVRIPAddress = Ip; //设备IP地址或者域名 Device IP
//Int16 DVRPortNumber = Int16.Parse(Port);//设备服务端口号 Device Port
//string DVRUserName = UserName;//设备登录用户名 User name to login
//string DVRPassword = PassWord;//设备登录密码 Password to login
string DVRIPAddress = Ip; //设备IP地址或者域名 Device IP
Int16 DVRPortNumber = Int16.Parse(Port);//设备服务端口号 Device Port
string DVRUserName = UserName;//设备登录用户名 User name to login
string DVRPassword = PassWord;//设备登录密码 Password to login
//Debug.LogError("CameraInfo:"+Ip+" "+Port+" "+UserName+" "+PassWord+"\n"+DateTime.Now);
//登录设备 Login the device
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(DVRIPAddress, DVRPortNumber, DVRUserName, DVRPassword, ref DeviceInfo);
if (m_lUserID < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
str = "NET_DVR_Login_V30 failed : \n"+iLastErr+"\n"+ GetErroCode(iLastErr); //登录失败,输出错误号 Failed to login and output the error code
Debug.LogError(str);
if(action!=null)
{
action(false);
}
return;
}
else
{
//登录成功
Debug.Log("NET_DVR_Login_V30 succ!");
if (action != null)
&
{
iIPDevID[i] = -1;
iChannelNum[i] = -1;
}
Debug.Log("Init Success!");
}
}
/// <summary>
/// 登录(初始化->登录->获取视屏流)
/// </summary>
/// <param name="Ip"></param>
/// <param name="Port"></param>
/// <param name="UserName"></param>
/// <param name="PassWord"></param>
/// <param name="action"></param>
public void Login(string Ip,string Port,string UserName,string PassWord,Action<bool>action=null)
{
if (m_lUserID < 0)
{
//JYHLoginVR JYHCamera = JYHLoginVR.Instance;
//string DVRIPAddress = Ip; //设备IP地址或者域名 Device IP
//Int16 DVRPortNumber = Int16.Parse(Port);//设备服务端口号 Device Port
//string DVRUserName = UserName;//设备登录用户名 User name to login
//string DVRPassword = PassWord;//设备登录密码 Password to login
string DVRIPAddress = Ip; //设备IP地址或者域名 Device IP
Int16 DVRPortNumber = Int16.Parse(Port);//设备服务端口号 Device Port
string DVRUserName = UserName;//设备登录用户名 User name to login
string DVRPassword = PassWord;//设备登录密码 Password to login
//Debug.LogError("CameraInfo:"+Ip+" "+Port+" "+UserName+" "+PassWord+"\n"+DateTime.Now);
//登录设备 Login the device
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(DVRIPAddress, DVRPortNumber, DVRUserName, DVRPassword, ref DeviceInfo);
if (m_lUserID < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
str = "NET_DVR_Login_V30 failed : \n"+iLastErr+"\n"+ GetErroCode(iLastErr); //登录失败,输出错误号 Failed to login and output the error code
Debug.LogError(str);
if(action!=null)
{
action(false);
}
return;
}
else
{
//登录成功
Debug.Log("NET_DVR_Login_V30 succ!");
if (action != null)
&

本文详细介绍了如何在Unity3D游戏引擎中与海康摄像头进行对接,包括视频流的接入、实时预览及数据处理等关键步骤,为实时监控和互动应用提供了技术实现方案。
最低0.47元/天 解锁文章
2620

被折叠的 条评论
为什么被折叠?



