拌合楼管理系统(七) 海康威视摄像头视频预览

前言: 预览摄像头实时画面

无人值守理论上应该不需要做视频画面的预览,但还是做个技术储备吧,可以应用到需要人为干预拍照的场景下.


一、登录设备返回设备句柄

cs 复制代码
 private  int  Login(string ipAddress, string username, string password, string port = "8000")
 {

     CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();
     //设备IP地址或者域名
     byte[] byIP = System.Text.Encoding.Default.GetBytes(ipAddress);
     struLogInfo.sDeviceAddress = new byte[129];
     byIP.CopyTo(struLogInfo.sDeviceAddress, 0);
     //设备用户名
     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);
     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);    
     return  m_lUserID;

 }

登录的代码如上,整个过程如下:

1. 定义一个结构体 NET_DVR_USER_LOGIN_INFO

2. 设置登录设备的IP,需要转换成byte数组

3. 设置设备的用户名,同样需要转换成byte数组

4. 设置设备的登录密码,同样要转换为byte数组

5. 设置设备的端口,类型为数值,默认的端口是8000

6. 设置是否异步登录, bUseAsynLogin = false , 0否,1是

7. 定义设备 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();

8. 将结构体传入到设备来进行登录,返回设句柄, 如果ID大于0那么表明是登录成功。

二、预览设备图像:

用的winform开发,在form上定义一个picturebox来实时显示摄像头的图像设备。

cs 复制代码
   private int  LiveView(int m_userid,PictureBox pic) {
       CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
       lpPreviewInfo.hPlayWnd = pic.Handle;//预览窗口
       lpPreviewInfo.lChannel = 1;//预te览的设备通道
       lpPreviewInfo.dwStreamType = 1;//码流类型: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; 
       //打开预览 Start live view 
       int m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_userid, ref lpPreviewInfo, null/*RealData*/, pUser);
        return m_lRealHandled;          
   }

1. 定义一个NET_DVR_PREVIEWINFO 结构体。

2. 设置预览窗口为picturebox Handle

3. 设置预览的设备通道

4. 设置码流,我设置为1,用的子码流,摄像头比较少可以用0主码流这样清晰度比较高了。

5. 连接方式用TCP,阻塞取流,最大缓存1,剩余两个参数按照默认了。

6. 打开设备预览,返回句柄。传入的m_userid就是我们前面登录过程返回的设备句柄。如果返回大于0那么就预览成功了。

三、关闭预览

调用CHCNetSDK.NET_DVR_StopRealPlay(m_lRealHandle)

cs 复制代码
 if (!CHCNetSDK.NET_DVR_StopRealPlay(m_lRealHandle))
 {
     iLastErr = CHCNetSDK.NET_DVR_GetLastError();
     str = "NET_DVR_StopRealPlay failed, error code= " + iLastErr;
     MessageBox.Show(str);
     return;
 }
 m_lRealHandle = -1;

四、注销登录

注销登录前应该先要关闭预览,检测是否已经关闭预览,判断预览的句柄是否小于0了,

cs 复制代码
    if (m_lRealHandle >= 0)
    {
              return;
    }

    if (!CHCNetSDK.NET_DVR_Logout(m_lUserID))
    {
        iLastErr = CHCNetSDK.NET_DVR_GetLastError();
        str = "NET_DVR_Logout failed, error code= " + iLastErr;
        return;           
    }
    m_lUserID = -1;
 
}

总结:

视频预览实现搞明白了过程还是比较简单的,步骤就是先登录,然后调用预览的方法。如果需要关闭程序最好还是先关闭预览,然后注销登录。