持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
上一篇文章介绍了如何获取相机文件中的数据,今天这篇文章我们来介绍如何使用代码操作海康摄像头。
海康摄像头方法调用
根据上一篇文章的相机正常工作流程:
打开相机->打开直播->开始录像->停止录像->停止直播->退出相机
给出对应的API操作方法,API的顺序就是按照流程来写的。
1:初始化相机
无论是什么设备,第一步一定是初始化,就类似于我们C++类中的构造函数一样,至关重要。
调用函数:NET_DVR_Init();
对整个网络SDK系统的初始化,内存预分配等操作。
返回值:TRUE 表示成功;FALSE 表示失败
在接口调用过程中,如果遇到错误时,需要使用NET_DVR_GetLastError获取错误码
例子:
BOOL bState=NET_DVR_Init();
if(!bState)
{
DWORD dwErrorCode=NET_DVR_GetLastError();
OutputLogInfo("初始化设备失败,错误码:" , (int)dwErrorCode);
return false;
}
2:注册设备
调用函数:NET_DVR_Login_V30
参数说明:
参数1:char *sDVRID;
设备IP地址或者是静态域名,字符数不能大于128个。
在这里传入的参数对应camera.csv的第三列,也就是IP地址
参数2:WORD *DVRPort;
设备端口号,这里传入的参数对应camera.csv的第四列,也就是端口
参数3:char *sUserName;
登录的用户名
参数4:char *sPassword;
登录的密码
在这里,我对参数3和参数4一起说明,用户名和密码开发人员可以自定义设置,所以传入的是提前给相机设定好的,而非任意的。
参数5:LPNET_DVR_DEVICEINFO_V30 lpDeviceInfo
该参数是被传出来,需要注册设备的相机信息
该函数的具体使用
NET_DVR_DEVICEINFO_V30 DeviceInfoTmp;
memset(&DeviceInfoTmp, 0, sizeof(NET_DVR_DEVICEINFO_V30));
USES_CONVERSION;
LONG loginID = NET_DVR_Login_V30(chIP , Port, (char*)m_sUserName.c_str() , (char*)m_sPassword.c_str() , &DeviceInfoTmp);//用户注册设备
返回值loginID,如果是-1,说明设备注册失败。
返回非-1的情况,表示返回的是用户ID信息,并且,该用户ID具有唯一性,在后续对摄像头做打开、关闭等具体操作时都需要此编号来实现的。
3:注册接收异常消息的回调函数
调用函数:NET_DVR_SetExceptionCallBack_V30
该函数需要注意的是,windows环境与Linux环境接口参数是不一样的,这里我只说明windows下接口讲解。
当前参数比较简单,只需要记住这样一句话:在Windows环境下第二个参数与第三个删除不能同时为NULL
使用例子如下所示:
4:实时预览设置
调用函数:NET_DVR_RealPlay
参数说明:
参数1:LONG lUserID;
这个参数也就是之前2讲述的注册设备的返回值
参数2:LPNET_DVR_CLIENTINFO
预览参数。这里传入的是需要绑定的控件用于展示实时画面
具体使用:
NET_DVR_CLIENTINFO ClientInfo;//播放
memset(&ClientInfo, 0, sizeof(NET_DVR_CLIENTINFO));
ClientInfo.hPlayWnd = hwnd;//播放用控件
ClientInfo.lChannel = 1;
ClientInfo.lLinkMode = 0;
ClientInfo.sMultiCastIP = NULL;
LONG playHandle = NET_DVR_RealPlay(loginID, &ClientInfo);
返回值:-1失败
其他返回值作为NET_DVR_StopRealPlay等函数的句柄参数
5:开始录制
调用函数:NET_DVR_SaveRealData
参数说明:
参数1:LONG lRealHandle;
接口2的返回值
参数2:char *sFileName;
文件路径指针,也就是录制的视频需要存储的名称,例如:"D:\test.mp4";
使用说明:
USES_CONVERSION; //这句话至关重要
std::string sSavePath = m_sSavePath + sFileName; //记录 录像生成的位置
BOOL bState = NET_DVR_SaveRealData(logId,(char*)sSavePath.c_str());
if (bState == FALSE)
{
//返回值错误,说明数据捕获失败!
}
6:停止录制
调用函数:NET_DVR_StopSaveRealData
该函数只有一个参数,并且传入的参数也是接口4的返回值
那么,我们在什么时候需要调用停止录制呢?
只有当接口2的返回值有效,并且已经开始录制时,调用当前接口视为有效调用!
7:关闭实时预览
当我们开始录制之前是打开了预览,那么当停止录制后一定要关闭实时预览。顺序一定不能搞错。
调用函数:NET_DVR_StopRealPlay
该函数只有一个参数,并且传入的参数也是接口4的返回值
8:注销设备
调用函数:NET_DVR_Logout_V30
该函数只有一个参数,并且传入的参数也是接口2的返回值
注意:这里调用函数的参数与6,7是不一致的,大家一定要分清楚
到这里,这几个重要的API已经讲解完了。
后续文章会继续更新关于海康相机的功能!
我是中国好公民st,一名C++开发程序猿~