前言: 预览摄像头实时画面
无人值守理论上应该不需要做视频画面的预览,但还是做个技术储备吧,可以应用到需要人为干预拍照的场景下.
一、登录设备返回设备句柄
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来实时显示摄像头的图像设备。
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)
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了,
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;
}
总结:
视频预览实现搞明白了过程还是比较简单的,步骤就是先登录,然后调用预览的方法。如果需要关闭程序最好还是先关闭预览,然后注销登录。