海康威视摄像机SDK代码整理
对海康威视的实时预览demo做了整理。提取了比较常用的一些方法。
- 预览
- 对讲
- 抓图
- 录像
- 云台控制
using PreviewDemo; using System; using System.ComponentModel; using System.Drawing; using System.IO; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; public class VideoClass { /// <summary> /// 索引号 /// </summary> public int Index { get; set; } /// <summary> /// IP地址 /// </summary> public string IP { get; set; } /// <summary> /// 端口号 /// </summary> public ushort Port { get; set; } /// <summary> /// 登录名 /// </summary> public string UserName { get; set; } /// <summary> /// 登录密码 /// </summary> public string PassWord { get; set; } /// <summary> /// 摄像机名称 /// </summary> public string VideoName { get; set; } /// <summary> /// 连接ID /// </summary> public Int32 ConnectID { get; set; } = -1; /// <summary> /// 错误代码 /// </summary> public uint ILastErr { get; private set; } /// <summary> /// 预览ID /// </summary> public int PlayID { get; private set; } /// <summary> /// 所在容器 /// </summary> public PictureBox ShowPicBox { get; set; } /// <summary> /// 预览设置 /// </summary> CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO() { //预te览的设备通道 lChannel = 1, //码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推 dwStreamType = 1,//原来此处是 0 //连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP dwLinkMode = 4,//原来此处是0 //0- 非阻塞取流,1- 阻塞取流 bBlocked = true, //播放库播放缓冲区最大缓冲帧数 dwDisplayBufNum = 5, byProtoType = 0, byPreviewMode = 0 }; /// <summary> /// 打开预览 /// </summary> /// <param name="RealPlayWnd">预览容器</param> /// <returns></returns> public void StartPaly(PictureBox box,out bool Success,out string Message) { //lpPreviewInfo.hPlayWnd = PlayWnd.Handle; //PlayWnd.Click += Control_Click; //PlayWnd.DoubleClick += Control_DoubleClick; lpPreviewInfo.hPlayWnd = box.Handle; ShowPicBox = box; IntPtr pUser = new IntPtr(); PlayID = CHCNetSDK.NET_DVR_RealPlay_V40(ConnectID, ref lpPreviewInfo, null, pUser); if (PlayID < 0) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "预览失败。错误代码:" + ILastErr; Playing = false; Success = false; } else { int p = CHCNetSDK.NET_DVR_GetRealPlayerIndex(PlayID); PlayCtrl.PlayM4_RenderPrivateData(p, 2, false); Playing = true; Message = ""; Success = true; } } public bool Playing { get; private set; } IntPtr pUser = new IntPtr(); /// <summary> /// 开始预览 /// 用在主预览结束之后,恢复到原来的小屏预览。或者在预览窗口停止预览之后,重新开始预览 /// </summary> /// <returns></returns> public void StartPaly(out bool Success,out string Message) { StopPaly(out bool Success2, out string Message2); lpPreviewInfo.hPlayWnd = ShowPicBox.Handle; lpPreviewInfo.dwStreamType = 1; lpPreviewInfo.dwLinkMode = 4; PlayID = CHCNetSDK.NET_DVR_RealPlay_V40(ConnectID, ref lpPreviewInfo, null, pUser); if (PlayID < 0) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "预览失败。错误代码:" + ILastErr; Success = false; } else { int p = CHCNetSDK.NET_DVR_GetRealPlayerIndex(PlayID); PlayCtrl.PlayM4_RenderPrivateData(p, 2, false); Playing = true; Message = ""; Success = true; } } /// <summary> /// 主预览的时候切换取码流和连接方式 /// </summary> /// <param name="Success"></param> /// <param name="Message"></param> public void StartMainPlay(out bool Success,out string Message) { StopPaly(out bool Success2, out string Message2); lpPreviewInfo.dwStreamType = 0; lpPreviewInfo.dwLinkMode = 0; lpPreviewInfo.hPlayWnd = ShowPicBox.Handle; PlayID = CHCNetSDK.NET_DVR_RealPlay_V40(ConnectID, ref lpPreviewInfo, null, pUser); if (PlayID < 0) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "预览失败。错误代码:" + ILastErr; Success = false; } else { int p = CHCNetSDK.NET_DVR_GetRealPlayerIndex(PlayID); PlayCtrl.PlayM4_RenderPrivateData(p, 2, false); Playing = true; Message = ""; Success = true; } } /// <summary> /// 停止预览 /// </summary> /// <returns></returns> public void StopPaly(out bool Success,out string Message) { if (!CHCNetSDK.NET_DVR_StopRealPlay(PlayID)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "停止预览失败。错误代码:" + ILastErr; Success = true; } else { Playing = false; Message = ""; Success = true; } } /// <summary> /// 连接设备 /// </summary> /// <param name="IP">IP地址</param> /// <param name="Port">设备端口号</param> /// <param name="UserName">设备用户名</param> /// <param name="Password">设备密码</param> /// <returns>连接ID</returns> public void ConnectionVideo() { Int32 m_lUserID1; CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO(); //设备IP地址 byte[] byIP = System.Text.Encoding.Default.GetBytes(IP); struLogInfo.sDeviceAddress = new byte[129]; byIP.CopyTo(struLogInfo.sDeviceAddress, 0); //设备端口号 struLogInfo.wPort = Port; //设备用户名 byte[] byUserName = System.Text.Encoding.Default.GetBytes(UserName); struLogInfo.sUserName = new byte[64]; byUserName.CopyTo(struLogInfo.sUserName, 0); //设备密码 byte[] byPassWord = System.Text.Encoding.Default.GetBytes(PassWord); struLogInfo.sPassword = new byte[64]; byPassWord.CopyTo(struLogInfo.sPassword, 0); CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40(); //连接设备 m_lUserID1 = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo); if (m_lUserID1 < 0) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); ConnectID = -1; } else { ConnectID = m_lUserID1; } } #region 云台控制的代码 /// <summary> /// 云台向上 /// </summary> public void Up_MouseDown(out bool Success,out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.TILT_UP, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Up_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.TILT_UP, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 云台向下 /// </summary> public void Down_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.TILT_DOWN, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Down_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.TILT_DOWN, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 云台左上 /// </summary> public void Left_up_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.UP_LEFT, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Left_up_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.UP_LEFT, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 云台右上 /// </summary> public void Right_up_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.UP_RIGHT, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Right_up_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.UP_RIGHT, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 云台左下 /// </summary> public void Left_down_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.DOWN_LEFT, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Left_down_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.DOWN_LEFT, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 云台右下 /// </summary> public void Right_down_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.DOWN_RIGHT, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Right_down_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.DOWN_RIGHT, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 云台向左 /// </summary> public void Left_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.PAN_LEFT, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Left_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.PAN_LEFT, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 云台向右 /// </summary> public void Right_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.PAN_RIGHT, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Right_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.PAN_RIGHT, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 焦距变大 /// </summary> public void Zoom_in_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.ZOOM_IN, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Zoom_in_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.ZOOM_IN, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 焦距变小 /// </summary> public void Zoom_out_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.ZOOM_OUT, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Zoom_out_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.ZOOM_OUT, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 焦点前调 /// </summary> public void Focus_near_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.FOCUS_NEAR, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Focus_near_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.FOCUS_NEAR, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 焦点后调 /// </summary> public void Focus_far_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.FOCUS_FAR, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Focus_far_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.FOCUS_FAR, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 光圈扩大 /// </summary> public void Iris_open_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.IRIS_OPEN, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Iris_open_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.IRIS_OPEN, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } /// <summary> /// 光圈缩小 /// </summary> public void Iris_close_MouseDown(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.IRIS_CLOSE, 0, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "按下时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } public void Iris_close_MouseUp(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_PTZControlWithSpeed(PlayID, (uint)CHCNetSDK.IRIS_CLOSE, 1, 3)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "放开时发生错误。错误代码" + ILastErr; Success = false; } else { Success = true; Message = ""; } } #endregion 云台控制代码结束 /// <summary> /// 语音对讲状态 /// </summary> public bool Talking { get; private set; } = false; /// <summary> /// 语音对讲 /// </summary> /// <param name="Success"></param> /// <param name="Message"></param> public void Talk(out bool Success, out string Message) { if (Talking == false) { int lVoiceComHandle = 0; //开始语音对讲 Start two-way talk CHCNetSDK.VOICEDATACALLBACKV30 VoiceData = new CHCNetSDK.VOICEDATACALLBACKV30(VoiceDataCallBack);//预览实时流回调函数 lVoiceComHandle = CHCNetSDK.NET_DVR_StartVoiceCom_V30(ConnectID, 1, true, VoiceData, IntPtr.Zero); //bNeedCBNoEncData [in]需要回调的语音数据类型:0- 编码后的语音数据,1- 编码前的PCM原始数据 if (lVoiceComHandle < 0) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "对讲打开失败, 错误代码= " + ILastErr; Success = false; } else { Talking = true; Success = true; Message = ""; } } else { Success = false; Message = "请先停止对讲"; } } public void VoiceDataCallBack(int lVoiceComHandle, IntPtr pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, System.IntPtr pUser) { byte[] sString = new byte[dwBufSize]; Marshal.Copy(pRecvDataBuffer, sString, 0, (Int32)dwBufSize); if (byAudioFlag == 0) { //将缓冲区里的音频数据写入文件 save the data into a file string str = "PC采集音频文件.pcm"; FileStream fs = new FileStream(str, FileMode.Create); int iLen = (int)dwBufSize; fs.Write(sString, 0, iLen); fs.Close(); } if (byAudioFlag == 1) { //将缓冲区里的音频数据写入文件 save the data into a file string str = "设备音频文件.pcm"; FileStream fs = new FileStream(str, FileMode.Create); int iLen = (int)dwBufSize; fs.Write(sString, 0, iLen); fs.Close(); } } /// <summary> /// 停止对讲 /// </summary> /// <param name="Success"></param> /// <param name="Message"></param> public void StopTalk(out bool Success, out string Message) { int lVoiceComHandle = 0; //停止语音对讲 Stop two-way talk if (!CHCNetSDK.NET_DVR_StopVoiceCom(lVoiceComHandle)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "对讲关闭失败, 错误代码= " + ILastErr; Success = false; } else { Talking = false; Message = ""; Success = true; } } /// <summary> /// 抓取截图 /// </summary> /// <param name="FilePath">保存文件路径</param> /// <param name="Success">成功与否</param> /// <param name="Message">提示信息</param> public void Capture(string FilePath, out bool Success, out string Message) { string FileName = FilePath + VideoName + DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒") + ".jpg"; CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new CHCNetSDK.NET_DVR_JPEGPARA { wPicQuality = 0, //图像质量 Image quality wPicSize = 0xff //抓图分辨率 Picture size: 2- 4CIF,0xff- Auto(使用当前码流分辨率),抓图分辨率需要设备支持,更多取值请参考SDK文档 }; if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(ConnectID, 1, ref lpJpegPara, FileName)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Success = false; Message = "保存失败。错误代码:" + ILastErr; } else { Success = true; Message = $"保存成功,保存在{FilePath}文件夹下!"; } } /// <summary> /// 录像状态 /// </summary> public bool BRecord { get; private set; } = false; /// <summary> /// 开始录像 /// </summary> /// <param name="FilePath">保存的文件夹路径</param> /// <param name="Success">成功与否</param> /// <param name="Message">错误信息</param> public void SaveRecord(string FilePath, out bool Success, out string Message) { string FileName = FilePath + VideoName + DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒") + ".mp4"; if (BRecord == false) { CHCNetSDK.NET_DVR_MakeKeyFrame(ConnectID, 1); //开始录像 if (!CHCNetSDK.NET_DVR_SaveRealData_V30(PlayID, 2, FileName)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "录像失败。错误代码:" + ILastErr; Success = false; } else { BRecord = true; Message = ""; Success = true; } } else { Message = "请先停止录像!"; Success = false; } } /// <summary> /// 停止录像 /// </summary> /// <param name="Success"></param> /// <param name="Message"></param> public void Stop_SaveRecord(out bool Success, out string Message) { if (!CHCNetSDK.NET_DVR_StopSaveRealData(PlayID)) { ILastErr = CHCNetSDK.NET_DVR_GetLastError(); Message = "停止录像失败,错误代码:" + ILastErr; Success = false; } else { BRecord = false; Message = "成功保存录像!"; Success = true; } } /// <summary> /// 断开连接 /// </summary> /// <param name="videos"></param> public void DisConnectVideo() { CHCNetSDK.NET_DVR_Logout(ConnectID); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探