背景:有三個攝像頭 一個沒有用 但是登陸的時候檢測是否在線,還有一個監控攝像頭用於錄制視頻,還有一個拍照攝像頭。每個攝像頭對應的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 應該退出成功了。