【Android】接入海康威视SDK(HCNetSDK)遇到的几个问题及解决方案

本文主要是介绍【Android】接入海康威视SDK(HCNetSDK)遇到的几个问题及解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先需要说的是我遇到的问题大部分是因为监控设备更新换代产生的。我们最初的设备的同轴电缆的监控,之后因为业务需要改成了新款的网络监控。但是对于海康官方给出的开发文档中并没有这些改变相应造成的程序方面的变动,或者说是新功能的api在开发文档中并不能找到。(现在不知道又没有完善,但是我是去年1月份做的软件修改,当时是没有的)

1.移动侦测如何去除

  这个功能是新款网络监控默认有的,而且在我们项目中的那款主机上是没法去除的。当时联系过海康客服(这时候需要吐槽一点为什么没有技术支持电话,因为邮件太慢了),客服是给了我两个解决方案:一个是在PC端登陆网络监控后台去修改配置,第二是在移动端代码做修改。

  按照客服给出的第一种方法,尝试了很多次可以修改但是无法保存修改。之后多次联系客服确认这个也没法去修改掉移动侦测的,最终只能在移动端代码上做修改。在代码上修改是真的不容易,首先是查阅开发文档并没有提及,然后就联系客服(不得不吐槽下邮件实在太慢了)需求解决方案。当时客服提出了一个解决流程和相关的api调用,但是很坑的就是我弄了整整一天一直没有调用出客服给出的api,联系客服也换过最新的sdk和so文件。最后耗费了我两天的时候最终客服给出的结果就是她提供的流程和相关api搞错了是pc端开发用的。

  最后按照客服给出的新的移动端流程和api调用,只给出了几个api名称然后让我自己去看开发文档。头疼的是开发文档上面找不到诶,联系客服又得转述到研发那边帮我咨询。最后辗转几次终于在自己的摸索和客服的配合下终于去除了移动侦测。说实话这个咨询周期太长了,至少耗费了两个礼拜。

如果在预览时去除移动侦测,需要在PlaySurfaceView里面做处理

        NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO();previewInfo.lChannel = iChan;previewInfo.dwStreamType = 1;previewInfo.bBlocked = 1;previewInfo.hHwnd = m_hHolder;// HCNetSDK start previewm_iPreviewHandle = HCNetSDK.getInstance().NET_DVR_RealPlay_V40(iUserID,previewInfo, null);if (m_iPreviewHandle < 0) {Log.e(TAG, "NET_DVR_RealPlay is failed!Err:"+ HCNetSDK.getInstance().NET_DVR_GetLastError());}//海康JNA调用去除移动侦测m_iPort = HCNetSDKJNAInstance.getInstance().NET_DVR_GetRealPlayerIndex(iUserID);HCNetSDKJNAInstance.getInstance().NET_DVR_GetRealPlayerIndex(m_iPreviewHandle);Player.getInstance().renderPrivateData(m_iPort,Player.PRIVATE_RENDER.RENDER_MD,0);

如果在回放里面去除移动侦测,同样需要在回放的调用方法里面做处理

                    NET_DVR_VOD_PARA vod_para_1 = new NET_DVR_VOD_PARA();vod_para_1.struBeginTime = startTime;vod_para_1.struEndTime = endTime;vod_para_1.byStreamType = 0;vod_para_1.struIDInfo.dwChannel = m_iStartChan;vod_para_1.hWnd = null;vod_para_1.hWnd = playView[0].getHolder().getSurface();m_iPlaybackID_1 = HCNetSDK.getInstance().NET_DVR_PlayBackByTime_V40(m_iLogID, vod_para_1);//海康JNA调用去除移动侦测m_iPort = HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iLogID);HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iPlaybackID_1);Player.getInstance().renderPrivateData(m_iPort, Player.PRIVATE_RENDER.RENDER_MD, 0);

其实就是这么很简单的方法处理,但是技术客服对于sdk的不熟悉还是什么原因。

2.判断当前通道是否有监控视频

需要修改海康官方demo中的loginNormalDevice方法,做预判断

private int loginNormalDevice() {// get instancem_oNetDvrDeviceInfoV30 = new NET_DVR_DEVICEINFO_V30();if (null == m_oNetDvrDeviceInfoV30) {Log.e(TAG, "HKNetDvrDeviceInfoV30 new is failed!");return -1;}// call NET_DVR_Login_v30 to login on, port 8000 as defaultint iLogID = HCNetSDK.getInstance().NET_DVR_Login_V30(strIP, nPort,strUser, strPsd, m_oNetDvrDeviceInfoV30);if (iLogID < 0) {Log.e(TAG, "NET_DVR_Login is failed!Err:"+ HCNetSDK.getInstance().NET_DVR_GetLastError());return -1;}if (m_oNetDvrDeviceInfoV30.byChanNum > 0) {m_iStartChan = m_oNetDvrDeviceInfoV30.byStartChan;m_iChanNum = m_oNetDvrDeviceInfoV30.byChanNum;} else if (m_oNetDvrDeviceInfoV30.byIPChanNum > 0) {m_iStartChan = m_oNetDvrDeviceInfoV30.byStartDChan;m_iChanNum = m_oNetDvrDeviceInfoV30.byIPChanNum + m_oNetDvrDeviceInfoV30.byHighDChanNum * 256;}NET_DVR_IPPARACFG_V40 struIP = new NET_DVR_IPPARACFG_V40();HCNetSDK.getInstance().NET_DVR_GetDVRConfig(m_iLogID,HCNetSDK.NET_DVR_GET_IPPARACFG_V40, m_iStartChan, struIP);for (int i = 0; i < m_iChanNum; i++) {if (struIP.struIPDevInfo[i].byEnable == 0) {//i启用switch (i) {case 1:m_enableChan_1 = false;L("m_chan_1  enable");break;case 2:m_enableChan_2 = false;L("m_chan_2  enable");break;case 3:m_enableChan_3 = false;L("m_chan_3  enable");break;case 4:m_enableChan_4 = false;L("m_chan_4  enable");break;default:break;}}}if (m_iChanNum > 1) {ChangeSingleSurFace(false);} else {ChangeSingleSurFace(true);}Log.i(TAG, "NET_DVR_Login is Successful!");return iLogID;}

3.监控回放

这个也是一个坑,因为在官方给出的demo中界面上是有这个按钮的,但是点击并没有任何反应。在研究源码无果的情况下联系客服,客服说这个回放demo中是没有做处理的,需要我们自己按照开发文档去自己开发。

    public void playBack() {try {if (m_iLogID < 0) {Log.e(TAG, "please login on a device first");return;}if (m_iPlaybackID_1 < 0 || m_iPlaybackID_2 < 0|| m_iPlaybackID_3 < 0 || m_iPlaybackID_4 < 0) {if (m_iPlayID >= 0) {Log.i(TAG, "Please stop preview first");return;}NET_DVR_TIME startTime = new NET_DVR_TIME();startTime.dwYear = bYear;startTime.dwMonth = bMonth;startTime.dwDay = bDay;startTime.dwHour = bHour;startTime.dwMinute = bMinute;startTime.dwSecond = bSecond;NET_DVR_TIME endTime = new NET_DVR_TIME();endTime.dwYear = aYear;endTime.dwMonth = aMonth;endTime.dwDay = aDay;endTime.dwHour = aHour;endTime.dwMinute = aMinute;endTime.dwSecond = aSecond;if (m_enableChan_1) {NET_DVR_VOD_PARA vod_para_1 = new NET_DVR_VOD_PARA();vod_para_1.struBeginTime = startTime;vod_para_1.struEndTime = endTime;vod_para_1.byStreamType = 0;vod_para_1.struIDInfo.dwChannel = m_iStartChan;vod_para_1.hWnd = null;vod_para_1.hWnd = playView[0].getHolder().getSurface();m_iPlaybackID_1 = HCNetSDK.getInstance().NET_DVR_PlayBackByTime_V40(m_iLogID, vod_para_1);//海康JNA调用去除移动侦测m_iPort = HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iLogID);HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iPlaybackID_1);Player.getInstance().renderPrivateData(m_iPort, Player.PRIVATE_RENDER.RENDER_MD, 0);}if (m_enableChan_2) {NET_DVR_VOD_PARA vod_para_2 = new NET_DVR_VOD_PARA();vod_para_2.struBeginTime = startTime;vod_para_2.struEndTime = endTime;vod_para_2.byStreamType = 0;vod_para_2.struIDInfo.dwChannel = m_iStartChan + 1;vod_para_2.hWnd = null;vod_para_2.hWnd = playView[1].getHolder().getSurface();m_iPlaybackID_2 = HCNetSDK.getInstance().NET_DVR_PlayBackByTime_V40(m_iLogID, vod_para_2);//海康JNA调用去除移动侦测m_iPort = HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iLogID);HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iPlaybackID_2);Player.getInstance().renderPrivateData(m_iPort, Player.PRIVATE_RENDER.RENDER_MD, 0);}if (m_enableChan_3) {NET_DVR_VOD_PARA vod_para_3 = new NET_DVR_VOD_PARA();vod_para_3.struBeginTime = startTime;vod_para_3.struEndTime = endTime;vod_para_3.byStreamType = 0;vod_para_3.struIDInfo.dwChannel = m_iStartChan + 2;vod_para_3.hWnd = null;vod_para_3.hWnd = playView[2].getHolder().getSurface();m_iPlaybackID_3 = HCNetSDK.getInstance().NET_DVR_PlayBackByTime_V40(m_iLogID, vod_para_3);//海康JNA调用去除移动侦测m_iPort = HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iLogID);HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iPlaybackID_3);Player.getInstance().renderPrivateData(m_iPort, Player.PRIVATE_RENDER.RENDER_MD, 0);}if (m_enableChan_4) {NET_DVR_VOD_PARA vod_para_4 = new NET_DVR_VOD_PARA();vod_para_4.struBeginTime = startTime;vod_para_4.struEndTime = endTime;vod_para_4.byStreamType = 0;vod_para_4.struIDInfo.dwChannel = m_iStartChan + 3;vod_para_4.hWnd = null;vod_para_4.hWnd = playView[3].getHolder().getSurface();m_iPlaybackID_4 = HCNetSDK.getInstance().NET_DVR_PlayBackByTime_V40(m_iLogID, vod_para_4);//海康JNA调用去除移动侦测m_iPort = HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iLogID);HCNetSDKJNAInstance.getInstance().NET_DVR_GetPlayBackPlayerIndex(m_iPlaybackID_4);Player.getInstance().renderPrivateData(m_iPort, Player.PRIVATE_RENDER.RENDER_MD, 0);}if (m_iPlaybackID_1 >= 0 || m_iPlaybackID_2 >= 0|| m_iPlaybackID_3 >= 0 || m_iPlaybackID_4 >= 0) {NET_DVR_PLAYBACK_INFO struPlaybackInfo = null;if (m_enableChan_1) {if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(m_iPlaybackID_1,PlaybackControlCommand.NET_DVR_PLAYSTART,null, 0, struPlaybackInfo)) {Log.e(TAG, "net sdk playback start failed!");return;}}if (m_enableChan_2) {if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(m_iPlaybackID_2,PlaybackControlCommand.NET_DVR_PLAYSTART,null, 0, struPlaybackInfo)) {Log.e(TAG, "net sdk playback start failed!");return;}}if (m_enableChan_3) {if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(m_iPlaybackID_3,PlaybackControlCommand.NET_DVR_PLAYSTART,null, 0, struPlaybackInfo)) {Log.e(TAG, "net sdk playback start failed!");return;}}if (m_enableChan_4) {if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(m_iPlaybackID_4,PlaybackControlCommand.NET_DVR_PLAYSTART,null, 0, struPlaybackInfo)) {Log.e(TAG, "net sdk playback start failed!");return;}}m_oPlaybackBtn.setText("停止回放");} else {Log.i(TAG,"NET_DVR_PlayBackByName failed, error code: "+ HCNetSDK.getInstance().NET_DVR_GetLastError());}} else {if (m_enableChan_1){if (!HCNetSDK.getInstance().NET_DVR_StopPlayBack(m_iPlaybackID_1)) {Log.e(TAG, "1 net sdk stop playback failed");}}if (m_enableChan_2){if (!HCNetSDK.getInstance().NET_DVR_StopPlayBack(m_iPlaybackID_2)) {Log.e(TAG, "2 net sdk stop playback failed");}}if (m_enableChan_3){if (!HCNetSDK.getInstance().NET_DVR_StopPlayBack(m_iPlaybackID_3)) {Log.e(TAG, "3 net sdk stop playback failed");}}if (m_enableChan_4){if (!HCNetSDK.getInstance().NET_DVR_StopPlayBack(m_iPlaybackID_4)) {Log.e(TAG, "4 net sdk stop playback failed");}}// player stop playm_oPlaybackBtn.setText("实时预览");m_iPlaybackID_1 = -1;m_iPlaybackID_2 = -1;m_iPlaybackID_3 = -1;m_iPlaybackID_4 = -1;}} catch (Exception err) {Log.e(TAG, "error: " + err.toString());}}

这里需要提醒各位一下,因为我是做的四个通道的监控,所以如果不做通道判断的话,一旦有一个通道是不可用的情况时,进行四个通道的回放是会报错的。所以务必先处理通道的可用性判断,在进行相应通道的回放。

4.无法调用JNA方法

   这个问题不知道是不是个别情况,反正我是遇到了。首先遇到这种情况先确定导入的so文件库是否正确,如果是放置在jnilibs里面,需要做资源的引入。

sourceSets.main {jniLibs.srcDirs = ['src/main/libs']
}

如果资源文件引入正确,然后再确认是否将官方demo中的jna文件正确的导入到了自己的项目中
jna路径
我一开始是直接引入到自己的项目目录中去的,但是没法调用到里面的方法。所以我改成了demo中的路径,可以成功调用到里面的方法。不知道是官方故意这样处理还是说有什么其他原因。当然我下面使用的指静脉识别器也是同样处理才能完成api调用。

最后附上我的同轴电缆版本的demo地址:https://download.csdn.net/download/d38825/10123402
另外这个是网络监控改版的demo地址:https://download.csdn.net/download/d38825/10388596

这篇关于【Android】接入海康威视SDK(HCNetSDK)遇到的几个问题及解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702939

相关文章

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py