void DevChannelHK::onPreview(DWORD dwDataType, BYTE* pBuffer, DWORD dwBufSize) { //TimeTicker1(-1); switch (dwDataType) { case NET_DVR_SYSHEAD: { //系统头数据 if (!PlayM4_GetPort(&m_iPlayHandle)) { //获取播放库未使用的通道号 WarnL << "PlayM4_GetPort:" << NET_DVR_GetLastError(); break; } if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(m_iPlayHandle, STREAME_REALTIME)) { //设置实时流播放模式 WarnL << "PlayM4_SetStreamOpenMode:" << NET_DVR_GetLastError(); break; } if (!PlayM4_OpenStream(m_iPlayHandle, pBuffer, dwBufSize, 1024 * 1024)) { //打开流接口 WarnL << "PlayM4_OpenStream:" << NET_DVR_GetLastError(); break; } PlayM4_SetDecCallBackMend(m_iPlayHandle, [](int nPort,char * pBuf,int nSize,FRAME_INFO * pFrameInfo, void* nUser,int nReserved2) { DevChannelHK *chn=reinterpret_cast<DevChannelHK *>(nUser); if(chn->m_iPlayHandle!=nPort) { return; } chn->onGetDecData(pBuf,nSize,pFrameInfo); }, this); if (!PlayM4_Play(m_iPlayHandle, 0)) { //播放开始 WarnL << "PlayM4_Play:" << NET_DVR_GetLastError(); break; } InfoL << "设置解码器成功!" << endl; //打开音频解码, 需要码流是复合流 if (!PlayM4_PlaySoundShare(m_iPlayHandle)) { WarnL << "PlayM4_PlaySound:" << NET_DVR_GetLastError(); break; } } } break; case NET_DVR_STREAMDATA: { //流数据(包括复合流或音视频分开的视频流数据) if (dwBufSize > 0 && m_iPlayHandle != -1) { if (!PlayM4_InputData(m_iPlayHandle, pBuffer, dwBufSize)) { WarnL << "PlayM4_InputData:" << NET_DVR_GetLastError(); break; } } } break; case NET_DVR_AUDIOSTREAMDATA: { //音频数据 } break; case NET_DVR_PRIVATE_DATA: { //私有数据,包括智能信息 } break; default: break; } }
void MainWindow::PsDataCallBack(LONG lRealHandle, DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize, void* pUser) { HWND hWnd=((Movie*)pUser)->hWnd; //qDebug("hWnd(pUser):%d", *(HWND*)pUser); switch (dwDataType) { case NET_DVR_SYSHEAD: //系统头 if (!PlayM4_GetPort(&lPort)) //获取播放库未使用的通道号 { qDebug("PlayM4_GetPort"); break; } //m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放 if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(lPort, STREAME_REALTIME)) //设置实时流播放模式 { qDebug("PlayM4_SetStreamOpenMode"); break; } if (!PlayM4_OpenStream(lPort, pBuffer, dwBufSize, 1024*1024)) //打开流接口 { qDebug("PlayM4_OpenStream"); break; } qDebug("hWnd(pUser):%d", hWnd); if (!PlayM4_Play(lPort, hWnd)) //播放开始 { qDebug("PlayM4_Play"); break; } } break; case NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0 && lPort != -1) { if (!PlayM4_InputData(lPort, pBuffer, dwBufSize)) { qDebug("PlayM4_InputData"); break; } } } }
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser) { switch(dwDataType) { case NET_DVR_SYSHEAD: //系统头 if(!PlayM4_GetPort(&lPort)) break; //获取播放库未使用的通道号 if(dwBufSize > 0) { if(!PlayM4_SetStreamOpenMode(lPort,STREAME_REALTIME)) break; //设置实时流播放模式 if(!PlayM4_OpenStream(lPort,pBuffer,dwBufSize,1024*1024)) break; //打开流接口,1024 * 1024的数据何来? PlayM4_SetDecCallBack(lPort,DecCBFun); if(!PlayM4_SetDecCBStream(lPort,1)) break; if(!PlayM4_Play(lPort,NULL)) break;//播放开始 }//T_YV12 case NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0 && lPort != -1) { if(!PlayM4_InputData(lPort,pBuffer,dwBufSize)) break; } } }
int CPlayer::ReStartMonitor() { m_comSocket.Close(); m_streamParser.ClearBuf();//清除缓冲 memset(&m_rcRenderRect, 0, sizeof(RECT)); if( m_comSocket.Connect(m_clientInfo.connInfo.ip, m_clientInfo.connInfo.port) < 0 ) { m_comSocket.Close(); return HHV_ERROR_CONNECT; } int streamHeaderSize = 4*1024; memset( m_streamHeader, 0x00, sizeof(m_streamHeader) ); int ret = MonitorStartCmdMT(m_comSocket.m_hSocket, &m_clientInfo, m_streamHeader, streamHeaderSize); if( ret < 0 ) { m_comSocket.Close(); return ret; } PlayM4_Stop(m_index); PlayM4_CloseStream( m_index); ResetBuf(); //mode- 流模式(1-实时流/2-文件流) int nErr = 0; m_playType = STREAME_REALTIME; BOOL bret = PlayM4_SetStreamOpenMode(m_index, m_playType); bret = PlayM4_OpenStream( m_index, (BYTE*)m_streamHeader, streamHeaderSize, 600*1024); if (!bret) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); return -nErr; } m_disconnection = false; if( ! PlayM4_RigisterDrawFun( m_index, MP4SDKDrawFun, (DWORD)this) ) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); //TRACE_SDK_ERROR("执行 CHKSeries::RegisterDrawFun 中 PlayM4_RigisterDrawFun 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } bret = PlayM4_Play(m_index, m_hWnd); if (!bret) { nErr = PlayM4_GetLastError(m_index); //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::OpenStream 中 PlayM4_Play 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } m_hRenderWnd = m_hWnd; ResizeMonitorWindow(); //memcpy(&m_clientInfo, clientInfo, sizeof(UNISDK_CLIENT_INFO)); //开启线程, 接收视频流 m_exit = false; UINT threadid(0); m_Thread = (HANDLE)_beginthreadex( NULL, 4*1024*1024, DecoderRoutine, this, 0, &threadid ); if(m_Thread <= 0) { TRACE(_T("(MTVideo)!!!!!!开辟接受数据线程失败!m_Thread:%d errno:%d _doserrno:%d \r\n"), m_Thread, errno, _doserrno); SetEvent( m_hExitEvent ); } CloseHandle( m_Thread ); // // TRACE(_T("(MTVideo)监视成功结束 m_PlayHandle = %d dvrIP = %s channel = %d\r\n"), //m_PlayHandle, m_clientInfo.connInfo.ip, clientInfo->channel); return m_index; }
INT CPlayer::StartMonitor(HWND hWnd, HHV_CLIENT_INFO* clientInfo) { m_hWnd = hWnd; memcpy(&m_clientInfo, clientInfo, sizeof(HHV_CLIENT_INFO)); m_disconnection = false; if( clientInfo == NULL ) { return HHV_ERROR_INVALID_PARA; } if( !CCommClass::CheckIP(std::string(clientInfo->connInfo.ip)) ) { return HHV_ERROR_INVALID_IP; } if( m_comSocket.Connect(clientInfo->connInfo.ip, clientInfo->connInfo.port) < 0 ) { m_comSocket.Close(); return HHV_ERROR_CONNECT; } int streamHeaderSize = 4*1024; memset( m_streamHeader, 0x00, sizeof(m_streamHeader) ); int ret = MonitorStartCmdMT(m_comSocket.m_hSocket, clientInfo, m_streamHeader, streamHeaderSize); if( ret < 0 ) { //TRACE(_T("(MTVideo)监视失败 发送cmd失败或被服务器拒绝 vsIP = %s vsPort = %d dvrIP = %s channel = %d\r\n", // clientInfo->RFIP, clientInfo->RFTCPPort, clientInfo->connInfo.ip, clientInfo->channel); m_comSocket.Close(); return ret; } //TRACE(_T("(MTVideo)监视 发送cmd成功 vsIP = %s vsPort = %d dvrIP = %s channel = %d\r\n", // clientInfo->RFIP, clientInfo->RFTCPPort, clientInfo->connInfo.ip, clientInfo->channel); //mode- 流模式(1-实时流/2-文件流) int nErr = 0; m_playType = STREAME_REALTIME; //NAME(PlayM4_GetPort)(&m_index); BOOL bret = PlayM4_SetStreamOpenMode(m_index, m_playType); nErr = PlayM4_GetLastError(m_index); bret = PlayM4_OpenStream( m_index, (BYTE*)m_streamHeader, streamHeaderSize, 600*1024); nErr = PlayM4_GetLastError(m_index); if (!bret) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::OpenStream 中 PlayM4_OpenStream 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); //RACE_LOG("(MTVideo)监视失败 <Error pDvrSDK->OpenPlayStream Fail> m_PlayHandle = %d dvrIP = %s channel = %d\r\n", // m_PlayHandle, clientInfo->connInfo.ip, clientInfo->channel); return -nErr; } if( ! PlayM4_RigisterDrawFun( m_index, MP4SDKDrawFun, (DWORD)this) ) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); //TRACE_SDK_ERROR("执行 CHKSeries::RegisterDrawFun 中 PlayM4_RigisterDrawFun 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } bret = PlayM4_Play(m_index, hWnd); if (!bret) { nErr = PlayM4_GetLastError(m_index); //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::OpenStream 中 PlayM4_Play 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } m_hRenderWnd = hWnd; ResizeMonitorWindow(); TRACE(_T("(MTVideo)监视 OpenPlayStream成功 m_index = %d dvrIP = %s channel = %d\r\n"), m_index, clientInfo->connInfo.ip, clientInfo->channel); //memcpy(&m_clientInfo, clientInfo, sizeof(UNISDK_CLIENT_INFO)); //开启线程, 接收视频流 m_exit = false; UINT threadid(0); m_Thread = (HANDLE)_beginthreadex( NULL, 4*1024*1024, DecoderRoutine, this, 0, &threadid ); if(m_Thread <= 0) { TRACE(_T("(MTVideo)!!!!!!开辟接受数据线程失败!m_Thread:%d errno:%d _doserrno:%d \r\n"), m_Thread, errno, _doserrno); SetEvent( m_hExitEvent ); } CloseHandle( m_Thread ); TRACE(_T("(MTVideo)监视成功结束 m_PlayHandle = %d dvrIP = %s channel = %d\r\n"), m_PlayHandle, clientInfo->connInfo.ip, clientInfo->channel); return m_index; }
int CPlayer::StartPlayBackByTime(HWND hWnd, SYSTEM_VIDEO_FILE* recdFile, char* ssIP, int ssPort) { if( m_comSocket.Connect(ssIP, ssPort) < 0 ) { m_comSocket.Close(); return -1; } int streamHeaderSize = 4*1024; memset( m_streamHeader, 0x00, sizeof(m_streamHeader) ); SPlayBackByTimeResponseInfo rspBody; if( PlayStartCmdByTime(m_comSocket.m_hSocket, recdFile, m_streamHeader, streamHeaderSize, rspBody) < 0 ) { m_comSocket.Close(); return -1; } m_playbacklen = rspBody.nPlayBackLength; m_streamParser_PlayBack.SetSocketPara(&m_comSocket); m_streamParser_PlayBack.SetFileLenPara(m_playbacklen); //mode- 流模式(1-实时流/2-文件流) int nErr = 0; m_playType = STREAME_FILE; BOOL bret = PlayM4_SetStreamOpenMode(m_index, m_playType); bret = PlayM4_OpenStream( m_index, (BYTE*)m_streamHeader, streamHeaderSize, 600*1024); if (!bret) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::OpenStream 中 PlayM4_OpenStream 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); //RACE_LOG("(MTVideo)监视失败 <Error pDvrSDK->OpenPlayStream Fail> m_PlayHandle = %d dvrIP = %s channel = %d\r\n", // m_PlayHandle, clientInfo->connInfo.ip, clientInfo->channel); return -nErr; } if( ! PlayM4_RigisterDrawFun( m_index, MP4SDKDrawFun, (DWORD)this) ) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); //TRACE_SDK_ERROR("执行 CHKSeries::RegisterDrawFun 中 PlayM4_RigisterDrawFun 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } bret = PlayM4_Play(m_index, hWnd); if (!bret) { nErr = PlayM4_GetLastError(m_index); //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::OpenStream 中 PlayM4_Play 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } m_hRenderWnd = hWnd; ResizeMonitorWindow(); //开启线程, 接收视频流 m_exit = false; UINT threadid(0); m_Thread = (HANDLE)_beginthreadex( NULL, 4*1024*1024, DecoderRoutine, this, 0, &threadid ); if(m_Thread <= 0) { TRACE(_T("(MTVideo)!!!!!!开辟接受数据线程失败!m_Thread:%d errno:%d _doserrno:%d \r\n"), m_Thread, errno, _doserrno); SetEvent( m_hExitEvent ); } CloseHandle( m_Thread ); return m_index; return 0; }
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser) { CHaikangSDK *HaikangSDK = (CHaikangSDK *)dwUser; int screenNo = DlgMain->DlgScreen.m_video.m_haikang.GetHandleWindID(lRealHandle); LONG lPort = HaikangSDK->m_lPort[screenNo]; CWnd* pWnd=NULL; switch (dwDataType) { case NET_DVR_SYSHEAD: //系统头 if (PlayM4_GetPort(&lPort)) //获取播放库未使用的通道号 { DlgMain->DlgScreen.m_video.m_haikang.m_lPort[screenNo] = lPort; } //m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放 if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(lPort, STREAME_REALTIME)) //设置实时流播放模式 { PlayM4_FreePort(lPort); break; } if (!PlayM4_OpenStream(lPort, pBuffer, dwBufSize, 1920*1080*3)) //打开流接口 { PlayM4_FreePort(lPort); break; } if (!PlayM4_SetDisplayCallBack(lPort, RemoteDisplayCBFun)) { PlayM4_CloseStream(lPort); PlayM4_FreePort(lPort); break; } if(DlgSetSystem.m_display_preview) { pWnd= DlgMain->DlgScreen.m_screenPannel.GetPage(screenNo); if (!pWnd) { PlayM4_CloseStream(lPort); PlayM4_FreePort(lPort); return; } if (!PlayM4_Play(lPort, pWnd->m_hWnd)) //播放开始 { PlayM4_CloseStream(lPort); PlayM4_FreePort(lPort); break; } } else { if (!PlayM4_Play(lPort,NULL)) //播放开始 { PlayM4_CloseStream(lPort); PlayM4_FreePort(lPort); break; } } } break; case NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0 && lPort != -1) { if (!PlayM4_InputData(lPort, pBuffer, dwBufSize)) { break; } } break; } }
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void* dwUser) { if (lRealHandle == lRealHandle1) { switch (dwDataType) { case NET_DVR_SYSHEAD: //系统头 if (!PlayM4_GetPort(&nPort1)) //获取播放库未使用的通道号 { break; } //m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放 if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(nPort1, STREAME_REALTIME)) //设置实时流播放模式 { break; } if (!PlayM4_OpenStream(nPort1, pBuffer, dwBufSize, 1024 * 1024)) //打开流接口 { break; } //设置解码回调函数 只解码不显示 //if (!PlayM4_SetDecCallBack(lPort,DecCBFun)) //{ // //dRet=PlayM4_GetLastError(nPort1); // break; //} //设置解码回调函数 解码且显示在窗口句柄中 if (!PlayM4_SetDecCallBackEx(nPort1, DecCBFun, NULL, NULL)) { break; } if (!PlayM4_SetDisplayBuf(nPort1, 4))//设置缓冲区大小,2-5 { break; } if (!PlayM4_Play(nPort1, hPlayWnd1)) //播放开始 { break; } } case NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0 && nPort1 != -1) if (!PlayM4_InputData(nPort1, pBuffer, dwBufSize)) break; } } else { switch (dwDataType) { case NET_DVR_SYSHEAD: //系统头 if (!PlayM4_GetPort(&nPort2)) //获取播放库未使用的通道号 { break; } //m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放 if (dwBufSize > 0) { if (!PlayM4_SetStreamOpenMode(nPort2, STREAME_REALTIME)) //设置实时流播放模式 { break; } if (!PlayM4_OpenStream(nPort2, pBuffer, dwBufSize, 1024 * 1024)) //打开流接口 { break; } //设置解码回调函数 只解码不显示 //if (!PlayM4_SetDecCallBack(lPort,DecCBFun)) //{ // //dRet=PlayM4_GetLastError(nPort1); // break; //} //设置解码回调函数 解码且显示在窗口句柄中 if (!PlayM4_SetDecCallBackEx(nPort2, DecCBFun, NULL, NULL)) { break; } if (!PlayM4_SetDisplayBuf(nPort2, 4))//设置缓冲区大小,2-5 { break; } if (!PlayM4_Play(nPort2, hPlayWnd2)) //播放开始 { break; } } case NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0 && nPort2 != -1) if (!PlayM4_InputData(nPort2, pBuffer, dwBufSize)) break; } } }