以前用vc开发一个客户端,现在公司需要做一个视频点播系统。由于项目比较急用vc做,时间可能会不够,所以选择用c#来完成。这个点播系统主要包括客户端和流媒体服务器两个部分。开始项目之前要重新写海康的.h文件,引用vc写的dll。封装.h文件。
namespace HIK
{
public delegate void fVoiceDataCallBack(int lVoiceComHandle, [MarshalAs(UnmanagedType.LPArray)] byte[] pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, uint dwUser);
public delegate void SerialDataCallBack(int lSerialHandle, [MarshalAs(UnmanagedType.LPArray)] byte[] pRecvDataBuffer, uint dwBufSize, uint dwUser);
public delegate void DrawFun(int lRealHandle, System.Drawing.Graphics hDc, uint dwUser);
public delegate void RealDataCallBack(int lRealHandle, uint dwDataType, [MarshalAs(UnmanagedType.LPArray, SizeConst = 11520)] byte[] pBuffer, uint dwBufSize, uint dwUser);
public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, uint dwBufSize, uint dwUser);
public struct NET_DVR_DEVICEINFO
{
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
public byte[] sSerialNumber;//[SERIALNO_LEN]; //序列号
public byte byAlarmInPortNum; //DVR报警输入个数
public byte byAlarmOutPortNum; //DVR报警输出个数
public byte byDiskNum; //DVR 硬盘个数
public byte byDVRType; //DVR类型,
public byte byChanNum; //DVR 通道个数
public byte byStartChan; //起始通道号,例如DVS-1,DVR - 1
}
public struct NET_DVR_DISKSTATE
{
public uint dwVolume;//硬盘的容量
public uint dwFreeSpace;//硬盘的剩余空间
public uint dwHardDiskStatic; //硬盘的状态,休眠,活动,不正常等
}
public struct NET_DVR_TIME
{
public uint dwYear; //年
public uint dwMonth; //月
public uint dwDay; //日
public uint dwHour; //时
public uint dwMinute; //分
public uint dwSecond; //秒
}
public struct NET_DVR_FIND_DATA
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string sFileName;//文件名
public NET_DVR_TIME struStartTime;//文件的开始时间
public NET_DVR_TIME struStopTime;//文件的结束时间
public uint dwFileSize;//文件的大小
}
public struct NET_DVR_CHANNELSTATE
{
public byte byRecordStatic; //通道是否在录像,0-不录像,1-录像
public byte bySignalStatic; //连接的信号状态,0-正常,1-信号丢失
public byte byHardwareStatic;//通道硬件状态,0-正常,1-异常,例如DSP死掉
public char reservedData;
public uint dwBitRate;//实际码率
public uint dwLinkNum;//客户端连接的个数
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] //MAX_LINK
public uint[] dwClientIP;//客户端的IP地址
}
public struct NET_DVR_WORKSTATE
{
public uint dwDeviceStatic; //设备的状态,0-正常,1-CPU占用率太高,超过85%,2-硬件错误,例如串口死掉
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public NET_DVR_DISKSTATE[] struHardDiskStatic; //MAX_DISKNUM
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public NET_DVR_CHANNELSTATE[] struChanStatic;//通道的状态MAX_CHANNUM
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] byAlarmInStatic; //报警端口的状态,0-没有报警,1-有报警MAX_ALARMIN
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] byAlarmOutStatic; //报警输出端口的状态,0-没有输出,1-有报警输出MAX_ALARMOUT
public uint dwLocalDisplay;//本地显示状态,0-正常,1-不正常
}
public struct NET_DVR_ETHERNET
{
public string sDVRIP; //DVR IP地址
public string sDVRIPMask; // DVR IP地址掩码
public uint dwNetInterface; //网络接口 1-10MBase-T 2-10MBase-T全双工 3-100MBase-TX 4-100M全双工 5-10M/100M自适应
public ushort wDVRPort; //端口号
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] byMACAddr; //服务器的物理地址MACADDR_LEN
}
public struct NET_DVR_NETCFG
{
public uint dwSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public NET_DVR_ETHERNET[] struEtherNet; /* 以太网口 */
public string sManageHostIP; //远程管理主机地址
public short wManageHostPort; //远程管理主机端口号
public string sDNSIP; //DNS服务器地址
public string sMultiCastIP; //多播组地址
public string sGatewayIP; //网关地址
public string sNFSIP; //NAS主机IP地址
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] sNFSDirectory;//NAS目录PATHNAME_LEN
public uint dwPPPOE; //0-不启用,1-启用
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] sPPPoEUser; //PPPoE用户名NAME_LEN
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public string sPPPoEPassword;// PPPoE密码
public string sPPPoEIP; //PPPoE IP地址(只读)
public ushort wHttpPort; //HTTP端口号
}
public struct NET_DVR_ALARMOUTSTATUS
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] Output;//MAX_ALARMOUT
}
public struct NET_DVR_CLIENTINFO
{
public int lChannel;//通道号
public int lLinkMode;//最高位(31)为0表示主码流,为1表示子码流,0-30位表示码流连接方式: 0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-音视频分开(TCP)
public System.IntPtr hPlayWnd;//播放窗口的句柄,为NULL表示不播放图象
public string sMultiCastIP;//多播组地址
}
/// <summary>
/// 海康嵌入式
/// </summary>
public sealed class Hik_HCNetSDK
{
#region 常量定义
public const int NET_DVR_NOERROR = 0; //没有错误
public const int NET_DVR_PASSWORD_ERROR = 1; //用户名密码错误
public const int NET_DVR_NOENOUGHPRI = 2; //权限不足
public const int NET_DVR_NOINIT = 3; //没有初始化
public const int NET_DVR_CHANNEL_ERROR = 4; //通道号错误
public const int NET_DVR_OVER_MAXLINK = 5; //连接到DVR的客户端个数超过最大
public const int NET_DVR_VERSIONNOMATCH = 6; //版本不匹配
public const int NET_DVR_NETWORK_FAIL_CONNECT = 7;//连接服务器失败
public const int NET_DVR_NETWORK_SEND_ERROR = 8; //向服务器发送失败
public const int NET_DVR_NETWORK_RECV_ERROR = 9;//从服务器接收数据失败
public const int NET_DVR_NETWORK_RECV_TIMEOUT = 10; //从服务器接收数据超时

本文介绍了使用C#开发视频点播系统的过程,重点是封装海康SDK,包括处理海康SDK的回调函数、结构体和错误码,以及与服务器的交互。内容涵盖了一系列与视频流、网络配置、报警状态和硬盘状态相关的结构体和函数调用。
最低0.47元/天 解锁文章
721





