1. 问题描写
最近在搭建1个可视传感网,在调试早期就遇到了1个很奇怪的问题:
一样的型号的摄像机,一样的程序,有1部份摄像头正常工作,而有1大部份的不能正常解码显示。这个小demo是我使用海康SDK里面实例写的。文章的最后给出项目的代码,有兴趣的也能够跑跑程序,其实只是1个简单的例程而已,写在这里只是为了方便往后归纳总结。这里使用的海康网络摄像头型号是:DS⑵CD852MF-E。
代码中,摄像头的登录函数为:NET_DVR_Login_V30,播放函数:NET_DVR_RealPlay_V40。
在回调解码函数处设置断点,能跳到此函数中:
但是除ip为192.168.2.21和192.168.2.22这两个网络摄像机,换成其他的摄像机都显示不了。但是另外一方面,网络摄像头的登录没有问题,但是就是没有画面。
单步调试,看到lRealHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL);lRealHandle值为0,表示没有问题的啊…但是在回调函数设置断点却进不去,就说明没有回调解码。跟上面的区分就在这里。但是代码是1模1样的,摄像机型号都是1样的852MF-E,因此不知道问题出在哪里。
2. 解决方法
以上问题可简单描写为,1个可用的程序,但对1部份摄像头硬件可用,这些摄像头型号均是1样的,因此第1时间的想法是查看这些摄像机软件版本或硬件固件版本是不是1致,答案是不是定的:
因此我又试了多个摄像机,只要是v2.0 build 100521 和v4.0 build 090220,这样的都能显示,但是其他的软件版本都显示不了。1时半会要更新软件或固件版本也是1大工程,因此继续查阅SDK开发文档,发现其实可以查看装备登录预览的SDK日志,在代码中,只需在SDK初始化后调用NET_DVR_SetLogToFile()函数便可保存日志信息。启用写日志文件的函数定义以下:
BOOL NET_DVR_SetLogToFile(
DWORD nLogLevel, char *strLogDir, BOOL bAutoDel
);
其中,nLogLevel 表示日志的等级(默许为0):0-表示关闭日志,1-表示只输出ERROR毛病日志,2-输出ERROR毛病信息和DEBUG调试信息,3-输出ERROR毛病信息、DEBUG调试信息和INFO普通讯息等所有信息;
strLogDir 表示日志文件的路径,windows默许值为”C:SdkLog”;linux默许值”/home/sdklog/”;
bAutoDel 表示是不是删除超越的文件数,默许值为TRUE。
生成日志文件,发现实际上是缺少了必要的dll文件。
SDK V4.3.0.6
[2015⑴0⑵0 14:58:00.599][INF] version:This hcnetsdk version is 4.3.0.6 Version 2014_07_22.
SDK V4.3.0.6[2015⑴0⑵0 14:58:00.599][INF] LogonDev1 192.168.3.22:8000 in
[2015⑴0⑵0 14:58:00.601][INF] Private connect 192.168.3.22:8000 soc