登陆海康海康16路硬盘录像机机无法查看到全部视频画面

5991人阅读
解决方法(16)
一. 问题描述
最近在搭建一个可视传感网,在调试初期就遇到了一个很奇怪的问题:
同样的型号的摄像机,同样的程序,有一部分摄像头正常工作,而有一大部分的不能正常解码显示。这个小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(
nLogLevel,
*strLogDir,
其中,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
[ 14:58:00.599][INF] version:This hcnetsdk version is 4.3.0.6 Version 2014_07_22.
SDK V4.3.0.6[ 14:58:00.599][INF] LogonDev1 192.168.3.22:8000 in
[ 14:58:00.601][INF] Private connect 192.168.3.22:8000 sock=496 this=0xf115e8 cmd=0x10000 port=30473
[ 14:58:00.601][INF] OpenCommandConnection ptr=0xf115e8 id=4096
[ 14:58:00.601][INF] [SendCommandWithRecv] this=0xf115e8, cmd_id=0x1000, cmd=0x10000
[ 14:58:00.615][INF] [CloseCommandConnection] this=0xf115e8, cmd_id=0x1000
[ 14:58:00.615][INF] StopLinkInConnection sock=496 this=0xf115e8, command=0x10000
[ 14:58:00.620][INF] LogonDev1 192.168.3.22:8000 in
[ 14:58:00.630][INF] Private connect 192.168.3.22:8000 sock=496 this=0xf115e8 cmd=0x10010 port=30474
[ 14:58:00.630][INF] OpenCommandConnection ptr=0xf115e8 id=8192
[ 14:58:00.630][INF] [SendCommandWithRecv] this=0xf115e8, cmd_id=0x2000, cmd=0x10010
[ 14:58:00.631][DBG] MainStream 0xf0
[ 14:58:00.631][INF] SubStream 0x0, RTP/RTSP[0], Private and RTSP[0], streamPacketType[0x0]
[ 14:58:00.631][INF] [CloseCommandConnection] this=0xf115e8, cmd_id=0x2000
[ 14:58:00.631][INF] StopLinkInConnection sock=496 this=0xf115e8, command=0x10010
[ 14:58:00.636][INF] LogonDev1 192.168.3.22:8000 out, dev_ver=, protocol=0xf0f0 sn=DS2CD852MF-EBCCHWC
[ 14:58:00.636][INF] [UserCtrlInstance::AddUser] m_nCurrentUserIndex=0, i=0, m_nTotalUserNum=1
[ 14:58:00.636][INF] Login success. UserID=0, DevIP=192.168.3.22
[ 14:58:02.095][DBG] BaseEngine[class CNetPreviewSession / 1 / 1]::AllocSession[0] get instance[00F177C0]
[ 14:58:02.095][INF] Preview Session=0 channel[1], UserID[0]
[ 14:58:02.095][DBG] [0] userid[0] this[f177c0]PreviewStart in block[0] cbreal[13018cf]stand[0] userdatap[0] dw[0], hwnd[1905a2]
[ 14:58:02.095][INF] StreamMode[0], StreamProtocol[0xf0f0]
[ 14:58:02.095][DBG] [0] PreviewStart out
[ 14:58:02.095][DBG] [0][192.168.3.22:8000]preview LinkToDvr
[ 14:58:02.095][INF] StreamMode[0], StreamProtocol[0xf0f0]
[ 14:58:02.125][ERR] GlobalCtrl load [E:\Herbert Project\单个摄像机解码并显示\Debug\StreamTransClient.dll] with sdk path failed and get handle[0]
[ 14:58:02.129][ERR] Load StreamTransClient failed[syserr: 126]
[ 14:58:02.129][ERR] Preview Session=0 link proto=4
[ 14:58:02.129][ERR] [0] preview MainPreview link failed!!!
[ 14:58:02.129][DBG] userid[0] Preview[0] AysoNonBlockThread callback exception
[ 14:58:09.918][INF] [0]PreviewStop begin
[ 14:58:09.918][DBG] [0] NetPreview SessionStop in, player nPort[-1]
[ 14:58:09.918][ERR] (IExchangeProxy::RigisterCommandIndex)this preview[0] is not registered.
[ 14:58:09.918][DBG] [0] NetPreview SessionStop out
[ 14:58:09.918][DBG] BaseEngine[class CNetPreviewSession / 512 / 1 / 1]::DestroySessionByIndex[0] instance[00F177C0]
[ 14:58:12.274][DBG] FiniSDK begin SDK fini[1]
[ 14:58:12.274][DBG] [0] DelUser CurrentUserIndex -1 total[0]
[ 14:58:13.135][DBG] stop time thread
后面的操作就很简单了,在海康的SDK库文件中找到StreamTransClient.dll和SystemTransform.dll并添加到工程项目底下,问题解决。
三. 项目部分代码
上传时发现文件过大,因此只贴出部分代码:
#include "stdafx.h"
#include "SingleCamApp.h"
#include "SingleCamDlg.h"
#include "afxdialogex.h"
#include "HCNetSDK.h"
#include "plaympeg4.h"
#ifdef _DEBUG
#define new DEBUG_NEW
LONG nPort = -1;
HWND hPlayWnd = NULL;
LONG lUserID = -1;
LONG lRealHandle = -1;
CString IPToStr(DWORD dwIP);
void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2);
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser);
CSingleCamDlg::CSingleCamDlg(CWnd* pParent )
: CDialogEx(CSingleCamDlg::IDD, pParent)
m_hIcon = AfxGetApp()-&LoadIcon(IDR_MAINFRAME);
void CSingleCamDlg::DoDataExchange(CDataExchange* pDX)
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CAM_IP, m_ctrlDeviceIP);
BEGIN_MESSAGE_MAP(CSingleCamDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_Login, &CSingleCamDlg::OnBnClickedBtnLogin)
ON_BN_CLICKED(IDC_BTN_PlayCam, &CSingleCamDlg::OnBnClickedBtnPlaycam)
ON_BN_CLICKED(IDC_BTN_StopCam, &CSingleCamDlg::OnBnClickedBtnStopcam)
END_MESSAGE_MAP()
BOOL CSingleCamDlg::OnInitDialog()
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
NET_DVR_Init();
isLogin = FALSE;
isPlaying = FALSE;
hPlayWnd = GetDlgItem(IDC_ViewWindow)-&m_hW
m_ctrlDeviceIP.SetAddress(192, 168, 2, 21);
GetDlgItem(IDC_BTN_PlayCam)-&EnableWindow(FALSE);
GetDlgItem(IDC_BTN_StopCam)-&EnableWindow(FALSE);
return TRUE;
void CSingleCamDlg::OnPaint()
if (IsIconic())
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, reinterpret_cast&WPARAM&(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
CDialogEx::OnPaint();
HCURSOR CSingleCamDlg::OnQueryDragIcon()
return static_cast&HCURSOR&(m_hIcon);
//全局函数的定义//
CString IPToStr(DWORD dwIP)
CString strIP = _T("");
WORD add1,add2,add3,add4;
add1=(WORD)(dwIP&255);
add2=(WORD)((dwIP&&8)&255);
add3=(WORD)((dwIP&&16)&255);
add4=(WORD)((dwIP&&24)&255);
strIP.Format("%d.%d.%d.%d",add4,add3,add2,add1);
return strIP;
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser)
switch (dwDataType)
case NET_DVR_SYSHEAD:
if (!PlayM4_GetPort(&nPort))
if (dwBufSize & 0)
if (!PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME))
if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024*1024))
if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL))
if (!PlayM4_SetDisplayBuf(nPort, 4))
if (!PlayM4_Play(nPort,hPlayWnd))
case NET_DVR_STREAMDATA:
if (dwBufSize & 0 && nPort != -1)
if (!PlayM4_InputData(nPort, pBuffer, dwBufSize))
void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)
void CSingleCamDlg::OnBnClickedBtnLogin()
if (isLogin)
NET_DVR_Logout(lUserID);
isLogin = FALSE;
GetDlgItem(IDC_BTN_Login)-&SetWindowTextA("登录");
GetDlgItem(IDC_BTN_PlayCam)-&EnableWindow(FALSE);
char DeviceIP[16] = {0};
DWORD dwDeviceIP = 0;
m_ctrlDeviceIP.GetAddress(dwDeviceIP);
CString csTemp = IPToStr(dwDeviceIP);
sprintf_s(DeviceIP, "%s", csTemp.GetBuffer(0));
NET_DVR_DEVICEINFO_V30 struDeviceI
lUserID = NET_DVR_Login_V30(DeviceIP, 8000, "admin", "12345", &struDeviceInfo);
if (lUserID & 0)
AfxMessageBox("登录失败!");
isLogin = FALSE;
isLogin = TRUE;
GetDlgItem(IDC_BTN_Login)-&SetWindowTextA("注销");
GetDlgItem(IDC_BTN_PlayCam)-&EnableWindow(TRUE);
void CSingleCamDlg::OnBnClickedBtnPlaycam()
NET_DVR_PREVIEWINFO struPlayInfo = {0};
struPlayInfo.hPlayWnd
struPlayInfo.lChannel
struPlayInfo.dwStreamType = 0;
struPlayInfo.dwLinkMode
lRealHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL);
if (lRealHandle & 0)
AfxMessageBox("播放失败!");
isPlaying = FALSE;
GetDlgItem(IDC_BTN_Login)-&EnableWindow(FALSE);
GetDlgItem(IDC_BTN_PlayCam)-&EnableWindow(FALSE);
GetDlgItem(IDC_BTN_StopCam)-&EnableWindow(TRUE);
isPlaying = TRUE;
void CSingleCamDlg::OnBnClickedBtnStopcam()
NET_DVR_StopRealPlay(lRealHandle);
PlayM4_Stop(nPort);
PlayM4_CloseStream(nPort);
PlayM4_FreePort(nPort);
GetDlgItem(IDC_BTN_Login)-&EnableWindow(TRUE);
GetDlgItem(IDC_BTN_PlayCam)-&EnableWindow(TRUE);
GetDlgItem(IDC_BTN_StopCam)-&EnableWindow(FALSE);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:665831次
积分:9972
积分:9972
排名:第1861名
原创:249篇
评论:280条
阅读:9299
文章:146篇
阅读:219983
阅读:27802
阅读:6819
文章:11篇
阅读:84207
阅读:33294
文章:23篇
阅读:119200
(7)(10)(6)(18)(26)(26)(21)(29)(29)(9)(11)(7)(8)(8)(22)(10)(7)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
海康威视硬盘录像机常见问题解决方式,海康威视硬盘录像机,海康威视录像机,海康威视录像机说明书,海康威视录像机密码,海康威视录像机设置,海康威视录像机升级包,海康威视录像机升级,海康威视录像机报警,海康威视网络录像机
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
海康威视硬盘录像机常见问题解决方式
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 海康nvr硬盘录像机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信