多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 部分海康網絡攝像頭無法實現視頻流解碼與實時預覽

部分海康網絡攝像頭無法實現視頻流解碼與實時預覽

來源:程序員人生   發布時間:2016-04-05 08:05:38 閱讀次數:13369次

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 sock=496 this=0xf115e8 cmd=0x10000 port=30473 [2015⑴0⑵0 14:58:00.601][INF] OpenCommandConnection ptr=0xf115e8 id=4096 [2015⑴0⑵0 14:58:00.601][INF] [SendCommandWithRecv] this=0xf115e8, cmd_id=0x1000, cmd=0x10000 [2015⑴0⑵0 14:58:00.615][INF] [CloseCommandConnection] this=0xf115e8, cmd_id=0x1000 [2015⑴0⑵0 14:58:00.615][INF] StopLinkInConnection sock=496 this=0xf115e8, command=0x10000 [2015⑴0⑵0 14:58:00.620][INF] LogonDev1 192.168.3.22:8000 in [2015⑴0⑵0 14:58:00.630][INF] Private connect 192.168.3.22:8000 sock=496 this=0xf115e8 cmd=0x10010 port=30474 [2015⑴0⑵0 14:58:00.630][INF] OpenCommandConnection ptr=0xf115e8 id=8192 [2015⑴0⑵0 14:58:00.630][INF] [SendCommandWithRecv] this=0xf115e8, cmd_id=0x2000, cmd=0x10010 [2015⑴0⑵0 14:58:00.631][DBG] MainStream 0xf0 [2015⑴0⑵0 14:58:00.631][INF] SubStream 0x0, RTP/RTSP[0], Private and RTSP[0], streamPacketType[0x0] [2015⑴0⑵0 14:58:00.631][INF] [CloseCommandConnection] this=0xf115e8, cmd_id=0x2000 [2015⑴0⑵0 14:58:00.631][INF] StopLinkInConnection sock=496 this=0xf115e8, command=0x10010 [2015⑴0⑵0 14:58:00.636][INF] LogonDev1 192.168.3.22:8000 out, dev_ver=020220090317, protocol=0xf0f0 sn=DS2CD852MF-E0020100721BCCH401124400WC [2015⑴0⑵0 14:58:00.636][INF] [UserCtrlInstance::AddUser] m_nCurrentUserIndex=0, i=0, m_nTotalUserNum=1 [2015⑴0⑵0 14:58:00.636][INF] Login success. UserID=0, DevIP=192.168.3.22 [2015⑴0⑵0 14:58:02.095][DBG] BaseEngine[class CNetPreviewSession / 1 / 1]::AllocSession[0] get instance[00F177C0] [2015⑴0⑵0 14:58:02.095][INF] Preview Session=0 channel[1], UserID[0] [2015⑴0⑵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] [2015⑴0⑵0 14:58:02.095][INF] StreamMode[0], StreamProtocol[0xf0f0] [2015⑴0⑵0 14:58:02.095][DBG] [0] PreviewStart out [2015⑴0⑵0 14:58:02.095][DBG] [0][192.168.3.22:8000]preview LinkToDvr [2015⑴0⑵0 14:58:02.095][INF] StreamMode[0], StreamProtocol[0xf0f0] [2015⑴0⑵0 14:58:02.125][ERR] GlobalCtrl load [E:Herbert Project單個攝像機解碼并顯示DebugStreamTransClient.dll] with sdk path failed and get handle[0] [2015⑴0⑵0 14:58:02.129][ERR] Load StreamTransClient failed[syserr: 126] [2015⑴0⑵0 14:58:02.129][ERR] Preview Session=0 link proto=4 [2015⑴0⑵0 14:58:02.129][ERR] [0] preview MainPreview link failed!!! [2015⑴0⑵0 14:58:02.129][DBG] userid[0] Preview[0] AysoNonBlockThread callback exception [2015⑴0⑵0 14:58:09.918][INF] [0]PreviewStop begin [2015⑴0⑵0 14:58:09.918][DBG] [0] NetPreview SessionStop in, player nPort[⑴] [2015⑴0⑵0 14:58:09.918][ERR] (IExchangeProxy::RigisterCommandIndex)this preview[0] is not registered. [2015⑴0⑵0 14:58:09.918][DBG] [0] NetPreview SessionStop out [2015⑴0⑵0 14:58:09.918][DBG] BaseEngine[class CNetPreviewSession / 512 / 1 / 1]::DestroySessionByIndex[0] instance[00F177C0] [2015⑴0⑵0 14:58:12.274][DBG] FiniSDK begin SDK fini[1] [2015⑴0⑵0 14:58:12.274][DBG] [0] DelUser CurrentUserIndex ⑴ total[0] [2015⑴0⑵0 14:58:13.135][DBG] stop time thread

后面的操作就很簡單了,在海康的SDK庫文件中找到StreamTransClient.dll和SystemTransform.dll并添加到工程項目底下,問題解決。

3. 項目部份代碼

上傳時發現文件過大,因此只貼出部份代碼:

// SingleCamDlg.cpp : 實現文件 // #include "stdafx.h" #include "SingleCamApp.h" #include "SingleCamDlg.h" #include "afxdialogex.h" #include "HCNetSDK.h" #include "plaympeg4.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CSingleCamDlg 對話框 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 /*=NULL*/) : 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); // 設置小圖標 // TODO: 在此添加額外的初始化代碼 //此處需要對SDK進行init初始化 NET_DVR_Init(); isLogin = FALSE; isPlaying = FALSE; hPlayWnd = GetDlgItem(IDC_ViewWindow)->m_hWnd; //在程序初始化的時候就獲得播放窗口的句柄 m_ctrlDeviceIP.SetAddress(192, 168, 2, 21); GetDlgItem(IDC_BTN_PlayCam)->EnableWindow(FALSE); //初始狀態,播放和停止按鈕都是失能的 GetDlgItem(IDC_BTN_StopCam)->EnableWindow(FALSE); return TRUE; // 除非將焦點設置到控件,否則返回 TRUE } void CSingleCamDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于繪制的裝備上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使圖標在工作區矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 繪制圖標 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } HCURSOR CSingleCamDlg::OnQueryDragIcon() { return static_cast(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)) //獲得播放庫未使用的通道號 { break; } //m_iPort = lPort; //第1次回調的是系統頭,將獲得的播放庫port號賦值給全局port,下次回調數據時即便用此port號播放 if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME)) //設置實時流播放模式 { break; } if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024*1024)) //打開流接口 { break; } //設置解碼回調函數 只解碼不顯示 //if (!PlayM4_SetDecCallBack(lPort,DecCBFun)) //{ // //dRet=PlayM4_GetLastError(nPort); // break; //} //設置解碼回調函數 解碼且顯示在窗口句柄中 if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL)) { break; } if (!PlayM4_SetDisplayBuf(nPort, 4))//設置緩沖區大小,2⑸ { break; } if (!PlayM4_Play(nPort,hPlayWnd)) //播放開始 { break; } } case NET_DVR_STREAMDATA: //碼流數據 if (dwBufSize > 0 && nPort != -1) if (!PlayM4_InputData(nPort, pBuffer, dwBufSize)) break; } } 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); //播放按鈕 失效 } else { 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 struDeviceInfo; lUserID = NET_DVR_Login_V30(DeviceIP, 8000, "admin", "12345", &struDeviceInfo); if (lUserID < 0) //登錄失敗時,其他幾個按鈕都需要disable { AfxMessageBox("登錄失敗!"); isLogin = FALSE; } else { isLogin = TRUE; GetDlgItem(IDC_BTN_Login)->SetWindowTextA("注銷"); //登錄成功, 變成注銷 GetDlgItem(IDC_BTN_PlayCam)->EnableWindow(TRUE); //播放按鈕 有效 } } } void CSingleCamDlg::OnBnClickedBtnPlaycam() //播放 { NET_DVR_PREVIEWINFO struPlayInfo = {0}; struPlayInfo.hPlayWnd = NULL; //需要SDK解碼時句柄設為有效值,僅取流不解碼時可設為空 struPlayInfo.lChannel = 1; //預覽通道號 struPlayInfo.dwStreamType = 0; //0-主碼流,1-子碼流,2-碼流3,3-碼流4,以此類推 struPlayInfo.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP lRealHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL); if (lRealHandle < 0) { AfxMessageBox("播放失敗!"); isPlaying = FALSE;//播放標志位設置為假 } else { 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); //停止按鈕 失效 }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品亚洲欧美大片在线看 | h视频在线观看免费网站 | 色综合久久综合欧美综合网 | 欧美性xxxx偷拍 | 另类激情亚洲 | 美美女高清毛片视频黄的一免费 | 网友偷自拍原创区 | 一区自拍 | 亚洲精品高清在线一区二区三区 | 日韩激情中文字幕一区二区 | 伊人操| 日韩一区二三区无 | 国产日韩欧美精品一区二区三区 | jizz老师| 亚洲伦理网站 | 图片区小说区av区 | 国产欧美亚洲专区第一页 | 日本午夜理伦三级在线观看 | 亚洲 图片 小说 欧美 另类 | 国产最新一区二区三区天堂 | 伊人影院综合在线 | 欧美一二三区视频 | 国产精品久久成人影院 | 国产高清国内精品福利99久久 | 日韩中文字幕在线观看视频 | 久久久高清日本道免费观看 | 依人在线免费视频 | 乱人伦精品一区二区 | 免费观看的男女羞羞视频 | 真人性做爰aa毛片免费视频观看 | 精品哟哟哟国产在线观看不卡 | 拍拍拍在线观看视频免费 | 亚洲欧美综合一区二区三区四区 | 涩综合| 毛片机地| 国产成人精品久久综合 | 欧美精品三区 | 波多野结衣一区免费作品 | 最新日韩精品 | 一区小说二区另类小说三区图 | 国产成人精品免费视频软件 |