问题解决:部分海康网络摄像头无法实现视频流解码与实时预览

一. 问题描述

最近在搭建一个可视传感网,在调试初期就遇到了一个很奇怪的问题:

同样的型号的摄像机,同样的程序,有一部分摄像头正常工作,而有一大部分的不能正常解码显示。这个小demo是我使用海康SDK里面实例写的。文章的最后给出项目的代码,有兴趣的也可以跑跑程序,其实只是一个简单的例程而已,写在这里只是为了方便日后归纳总结。这里使用的海康网络摄像头型号是:DS-2CD852MF-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,表示没有问题的啊…但是在回调函数设置断点却进不去,就说明没有回调解码。跟上面的区别就在这里。但是代码是一模一样的,摄像机型号都是一样的852MF-E,因此不知道问题出在哪里。

二. 解决方法

以上问题可简单描述为,一个可用的程序,但对一部分摄像头硬件可用,这些摄像头型号均是一样的,因此第一时间的想法是查看这些摄像机软件版本或者硬件固件版本是否一致,答案是否定的:

因此我又试了多个摄像机,只要是v2.0 build 100521 和v4.0 build 090220,这样的都能显示,但是其他的软件版本都显示不了。一时半会要更新软件或固件版本也是一大工程,因此继续查阅SDK开发文档,发现其实可以查看设备登录预览的SDK日志,在代码中,只需在SDK初始化后调用NET_DVR_SetLogToFile()函数即可保存日志信息。启用写日志文件的函数定义如下:

BOOL NET_DVR_SetLogToFile( DWORD nLogLevel, char*strLogDir, BOOLbAutoDel);

其中,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-10-20 14:58:00.599][INF] version:This hcnetsdk version is 4.3.0.6 Version 2014_07_22.SDK V4.3.0.6[2015-10-20 14:58:00.599][INF] LogonDev1 192.168.3.22:8000 in[2015-10-20 14:58:00.601][INF] Private connect 192.168.3.22:8000 sock=496 this=0xf115e8 cmd=0x10000 port=30473[2015-10-20 14:58:00.601][INF] OpenCommandConnection ptr=0xf115e8 id=4096[2015-10-20 14:58:00.601][INF] [SendCommandWithRecv] this=0xf115e8, cmd_id=0x1000, cmd=0x10000[2015-10-20 14:58:00.615][INF] [CloseCommandConnection] this=0xf115e8, cmd_id=0x1000[2015-10-20 14:58:00.615][INF] StopLinkInConnection sock=496 this=0xf115e8, command=0x10000[2015-10-20 14:58:00.620][INF] LogonDev1 192.168.3.22:8000 in[2015-10-20 14:58:00.630][INF] Private connect 192.168.3.22:8000 sock=496 this=0xf115e8 cmd=0x10010 port=30474[2015-10-20 14:58:00.630][INF] OpenCommandConnection ptr=0xf115e8 id=8192[2015-10-20 14:58:00.630][INF] [SendCommandWithRecv] this=0xf115e8, cmd_id=0x2000, cmd=0x10010[2015-10-20 14:58:00.631][DBG] MainStream 0xf0[2015-10-20 14:58:00.631][INF] SubStream 0x0, RTP/RTSP[0], Private and RTSP[0], streamPacketType[0x0][2015-10-20 14:58:00.631][INF] [CloseCommandConnection] this=0xf115e8, cmd_id=0x2000[2015-10-20 14:58:00.631][INF] StopLinkInConnection sock=496 this=0xf115e8, command=0x10010[2015-10-20 14:58:00.636][INF] LogonDev1 192.168.3.22:8000 out, dev_ver=020220090317, protocol=0xf0f0 sn=DS2CD852MF-E0020100721BCCH401124400WC[2015-10-20 14:58:00.636][INF] [UserCtrlInstance::AddUser] m_nCurrentUserIndex=0, i=0, m_nTotalUserNum=1[2015-10-20 14:58:00.636][INF] Login success. UserID=0, DevIP=192.168.3.22[2015-10-20 14:58:02.095][DBG] BaseEngine[class CNetPreviewSession / 1 / 1]::AllocSession[0] get instance[00F177C0][2015-10-20 14:58:02.095][INF] Preview Session=0 channel[1], UserID[0][2015-10-20 14:58:02.095][DBG] [0] userid[0] this[f177c0]PreviewStart in block[0] cbreal[13018cf]stand[0] userdatap[0] dw[0], hwnd[1905a2][2015-10-20 14:58:02.095][INF] StreamMode[0], StreamProtocol[0xf0f0][2015-10-20 14:58:02.095][DBG] [0] PreviewStart out[2015-10-20 14:58:02.095][DBG] [0][192.168.3.22:8000]preview LinkToDvr[2015-10-20 14:58:02.095][INF] StreamMode[0], StreamProtocol[0xf0f0][2015-10-20 14:58:02.125][ERR] GlobalCtrl load [E:\Herbert Project\单个摄像机解码并显示\Debug\StreamTransClient.dll] with sdk path failed and get handle[0][2015-10-20 14:58:02.129][ERR] Load StreamTransClient failed[syserr: 126][2015-10-20 14:58:02.129][ERR] Preview Session=0 link proto=4[2015-10-20 14:58:02.129][ERR] [0] preview MainPreview link failed!!![2015-10-20 14:58:02.129][DBG] userid[0] Preview[0] AysoNonBlockThread callback exception[2015-10-20 14:58:09.918][INF] [0]PreviewStop begin[2015-10-20 14:58:09.918][DBG] [0] NetPreview SessionStop in, player nPort[-1][2015-10-20 14:58:09.918][ERR] (IExchangeProxy::RigisterCommandIndex)this preview[0] is not registered.[2015-10-20 14:58:09.918][DBG] [0] NetPreview SessionStop out[2015-10-20 14:58:09.918][DBG] BaseEngine[class CNetPreviewSession / 512 / 1 / 1]::DestroySessionByIndex[0] instance[00F177C0][2015-10-20 14:58:12.274][DBG] FiniSDK begin SDK fini[1][2015-10-20 14:58:12.274][DBG] [0] DelUser CurrentUserIndex -1 total[0][2015-10-20 14:58:13.135][DBG] stop time thread

后面的操作就很简单了,在海康的SDK库文件中找到StreamTransClient.dll和SystemTransform.dll并添加到工程项目底下,问题解决。

三. 项目部分代码

每一件事与每一个美丽景色,都有可能成为一生中的难忘。

问题解决:部分海康网络摄像头无法实现视频流解码与实时预览

相关文章:

你感兴趣的文章:

标签云: