背景:有三个摄像头 一个没有用 但是登陆的时候检测是否在线,还有一个监控摄像头用于录制视频,还有一个拍照摄像头。每个摄像头对应的democapture 存储于map 对象中,理想情况下 只需登陆一次,后续调用直接拿map中存储的对象。除非拍照失败等原因会,initsdk login camera
现场情况:偶现 拍照摄像头 掉线,同时监控摄像头也掉线 只能重启容器才能解决,网络良好 测试环境没有复现
解决过程:
1.原本demoCapture 中日志不完全,现在给每个sdk接口调用后 都打印
hCNetSDK.NET_DVR_GetLastError()
2.现场返回的日志显示:拍照摄像头usrID 有23 然后拍照时报 错误码11 参数错误,问了海康的技术 userid 0-2047
但是还是怀疑这个userid 导致的错误码11 ,因为只有这个参数的变化引起了这个问题。
3.仔细分析日之后得出结论:
监控摄像头运行一段时间报 5 设备总的连接数超过最大。例如网络摄像机只支持6路预览,预览第7路即会返回失败,错误码返回5。不同设备性能不一样,支持路数也不同。
导致sdk 重新初始化 所有摄像头重新登录 userid持续增加 拍照摄像头userid 增到20左右开始报错误码11
4.两个思路解决
4.1 userid 为什么会init后还叠加 :问了海康技术,
发现我的cleanup 和init不在一个线程导致,遂更改代码,cleanup 后直接调用init j解决此问题
4.2 解决 监控摄像头报5 的问题,因为摄像头版本的问题 还没解决 所以把这个接口调用分到了另外一个容器,不要影响拍照摄像头
4.3 其余问题:
NET_DVR_StopSaveRealData(lRealHandle);
这个接口之前没有判断参数,-1 或者null的时候也会报11错误码,后面判断了一下
hCNetSDK.NET_DVR_Logout_V30(this.userId)
这个接口一定要在前面接口执行完后执行 不然会报错误码12 但是返回是true 应该退出成功了。