DevChannelHK::DevChannelHK(int64_t i64LoginId, const char* pcDevName, int iChn, bool bMainStream) : DevChannel(HK_APP_NAME,(StrPrinter<<MD5(pcDevName).hexdigest()<<"_"<<iChn<<endl).data()), m_i64LoginId(i64LoginId) { InfoL << endl; NET_DVR_PREVIEWINFO previewInfo; previewInfo.lChannel = iChn; //通道号 previewInfo.dwStreamType = bMainStream ? 0 : 1; // 码流类型,0-主码流,1-子码流,2-码流3,3-码流4 等以此类推 previewInfo.dwLinkMode = 1; // 0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-RTP/RTSP,5-RSTP/HTTP previewInfo.hPlayWnd = 0; //播放窗口的句柄,为NULL表示不播放图象 previewInfo.byProtoType = 0; //应用层取流协议,0-私有协议,1-RTSP协议 previewInfo.dwDisplayBufNum = 1; //播放库播放缓冲区最大缓冲帧数,范围1-50,置0时默认为1 previewInfo.bBlocked = 0; m_i64PreviewHandle = NET_DVR_RealPlay_V40(m_i64LoginId, &previewInfo, [](LONG lPlayHandle,DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize,void* pUser) { DevChannelHK *self=reinterpret_cast<DevChannelHK *>(pUser); if(self->m_i64PreviewHandle!=(int64_t)lPlayHandle) { return; } self->onPreview(dwDataType,pBuffer,dwBufSize); }, this); if (m_i64PreviewHandle == -1) { throw std::runtime_error( StrPrinter << "设备[" << pcDevName << "/" << iChn << "]开始实时预览失败:" << NET_DVR_GetLastError() << endl); } }
bool HikNetHelper::beginRealplay(HikRealdataCallback callback,void* user) { NET_DVR_PREVIEWINFO struPlayInfo = {0}; if(_isLogin == false) { LOGOUT("Function HikNetHelper::beginRealplay -> You should login first!)"); return false; } _user = user; struPlayInfo.hPlayWnd = 0; //需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空 struPlayInfo.lChannel = 1; struPlayInfo.dwStreamType = 1; //0-主码流,1-子码流,2-码流 3,3-码流 4,以此类推 struPlayInfo.dwLinkMode = 0; //0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTP struPlayInfo.bBlocked = 1; //0- 非阻塞取流,1- 阻塞取流 _hikRealPlayHandle = NET_DVR_RealPlay_V40(_hikNetUserId, &struPlayInfo, NULL, NULL); if (_hikRealPlayHandle < 0) { LOGOUT("Function HikNetHelper::beginRealplay -> NET_DVR_RealPlay_V40 failed!! Error Code=%d)",NET_DVR_GetLastError()); logout(); return false; } int iRet; iRet = NET_DVR_SetRealDataCallBack(_hikRealPlayHandle, callback, (DWORD)this); if (!iRet) { LOGOUT("Function HikNetHelper::beginRealplay -> NET_DVR_RealPlay_V30 failed!! ERROR=%d)",NET_DVR_GetLastError()); endRealplay(); logout(); return false; } return true; }
void MainWindow::on_pushButton_clicked() { qDebug("button clicked"); // 注册设备 NET_DVR_DEVICEINFO_V30 struDeviceInfo; lUserID = NET_DVR_Login_V30("192.168.13.20", 8000, "admin", "1qaz2wsx", &struDeviceInfo); if (lUserID < 0) { qDebug("Login error, %d\n", NET_DVR_GetLastError()); NET_DVR_Cleanup(); return; } //--------------------------------------- //设置异常消息回调函数 NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL); //--------------------------------------- //启动预览并设置回调数据流 //HWND hWnd = (HWND)ui->frame->winId(); //获取窗口句柄 movie.hWnd = (HWND)ui->frame->winId(); //获取窗口句柄 qDebug("hWnd:%d", movie.hWnd); NET_DVR_PREVIEWINFO struPlayInfo = {0}; //struPlayInfo.hPlayWnd = hWnd; //需要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 lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, PsDataCallBack, &movie); if (lRealPlayHandle < 0) { DWORD error = NET_DVR_GetLastError(); qDebug("NET_DVR_RealPlay_V40 error, %d\n" , error); NET_DVR_Logout(lUserID); NET_DVR_Cleanup(); return; } qDebug("NET_DVR_RealPlay_V40 ok!"); //QThread::sleep(10000); ////--------------------------------------- ////关闭预览 //NET_DVR_StopRealPlay(lRealPlayHandle); ////注销用户 //NET_DVR_Logout(lUserID); ////释放SDK资源 //NET_DVR_Cleanup(); return; }
void CSingleCamDlg::OnBnClickedBtnPlaycam() //播放 { NET_DVR_PREVIEWINFO struPlayInfo1 = {0}; struPlayInfo1.hPlayWnd = hPlayWnd1; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空 struPlayInfo1.lChannel = 1; //预览通道号 struPlayInfo1.dwStreamType = 0; //0-主码流,1-子码流,2-码流3,3-码流4,以此类推 struPlayInfo1.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP NET_DVR_PREVIEWINFO struPlayInfo2 = { 0 }; struPlayInfo2.hPlayWnd = hPlayWnd2; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空 struPlayInfo2.lChannel = 1; //预览通道号 struPlayInfo2.dwStreamType = 0; //0-主码流,1-子码流,2-码流3,3-码流4,以此类推 struPlayInfo2.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP lRealHandle1 = NET_DVR_RealPlay_V40(lUserID1, &struPlayInfo1, g_RealDataCallBack_V30, NULL); lRealHandle2 = NET_DVR_RealPlay_V40(lUserID2, &struPlayInfo2, g_RealDataCallBack_V30, NULL); if (lRealHandle1 < 0 || lRealHandle2 < 0) { AfxMessageBox("播放失败!"); isPlaying = FALSE;//播放标志位设置为假 } else { GetDlgItem(IDC_BTN_Login)->EnableWindow(FALSE); //登录按钮失效 GetDlgItem(IDC_BTN_PlayCam)->EnableWindow(FALSE); //播放按钮失效 GetDlgItem(IDC_BTN_StopCam)->EnableWindow(TRUE); //停止按钮 有效 GetDlgItem(IDC_BTN_SavePicture)->EnableWindow(TRUE); // 抓图按钮 有效 GetDlgItem(IDC_BTN_SavePicture2)->EnableWindow(TRUE); // 抓图2按钮 有效 GetDlgItem(IDC_BTN_SaveRealData)->EnableWindow(TRUE); // 视频保存按钮 有效 isPlaying = TRUE; } NET_DVR_GetLastError(); }
j_result_t CHikSdkChannel::OpenStream(J_Obj *&pObj, CRingBuffer *pRingBuffer) { if (m_pAdapter->GetStatus() != jo_dev_ready) { m_pAdapter->Broken(); m_bOpened = false; return J_DEV_BROKEN; } if (m_bOpened && pObj != NULL) { //NET_DVR_MakeKeyFrame(m_pAdapter->GetUserId(), m_nChannel); (dynamic_cast<CHikSdkStream *> (pObj))->AddRingBuffer(pRingBuffer); return J_OK; } pObj = new CHikSdkStream(m_resid); NET_DVR_PREVIEWINFO prevInfo = {0}; prevInfo.lChannel = m_nChannel; prevInfo.dwStreamType = m_nStreamType; prevInfo.dwLinkMode = 0;//TCP prevInfo.hPlayWnd = NULL; prevInfo.bBlocked = 1;//no block prevInfo.bPassbackRecord = 0; prevInfo.byPreviewMode = 0; prevInfo.byProtoType = 0; m_hStream = NET_DVR_RealPlay_V40(m_pAdapter->GetUserId(), &prevInfo, CHikSdkStream::RealDataCallback, pObj); if (m_hStream == -1) { m_pAdapter->Broken(); //m_pAdapter->Relogin(); delete pObj; J_OS::LOGINFO("CHikSdkChannel::OpenStream StartView error, ret = %d", NET_DVR_GetLastError()); return J_STREAM_ERROR; } m_bOpened = true; m_pStream = pObj; (dynamic_cast<CHikSdkStream *> (pObj))->AddRingBuffer(pRingBuffer); (dynamic_cast<CHikSdkStream *> (pObj))->Startup(); return J_OK; }