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; } }
int CPlayer::InputData() { int ret = m_comSocket.Receive((char*)m_buffer, 8*1024); //每次收1K if( ret <= 0 ) { if(m_exit) { //TRACE(_T("CMTVideo::InputData 退出1 dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d ret = %d nReceiveOneTime = %dkbps\r\n", // m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager, ret, nReceiveOneTime); return -1; } //TRACE(_T("CMTVideo::InputData <m_comSocket.Recv Fail> dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d ret = %d nReceiveOneTime = %dkbps\r\n\r\n", // m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager, ret, nReceiveOneTime); //TRACE(_T("!!!!检测到网络出错,准备发送消息 majortype = %d, subtype = %d, m_index_MTManager = %d\r\n\r\n", // m_UniSDKCltInfo.connInfo.dvrType, m_UniSDKCltInfo.connInfo.subType, m_index_MTManager); //::PostMessage(m_hNotifyWnd, WM_NET_ERROR, m_index_MTManager, m_UniSDKCltInfo.connInfo.dvrType << 16 | m_UniSDKCltInfo.connInfo.subType ); m_exit = true; return -1; } if(m_exit) { //TRACE(_T("CMTVideo::InputData 退出2 dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d nReceiveOneTime = %dkbps\r\n", //m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager, nReceiveOneTime); return -1; } BOOL bret = PlayM4_InputData(m_index, (BYTE*)m_buffer, ret); if (!bret) { int nErr = PlayM4_GetLastError(m_index); if( nErr == PLAYM4_BUF_OVER ) return 0; //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::SetStreamBuf 中 PlayM4_InputData 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); //TRACE(_T("CMTVideo::InputData 退出3 dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d nReceiveOneTime = %dkbps\r\n\r\n", // m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager, nReceiveOneTime); //TRACE(_T("!!!!inputdata<0检测到网络出错,准备发送消息 majortype = %d, subtype = %d, m_index_MTManager = %d\r\n\r\n", // m_UniSDKCltInfo.connInfo.dvrType, m_UniSDKCltInfo.connInfo.subType, m_index_MTManager); //::PostMessage(m_hNotifyWnd, WM_NET_ERROR, m_index_MTManager, m_UniSDKCltInfo.connInfo.dvrType << 16 | m_UniSDKCltInfo.connInfo.subType ); return -nErr; } return 0; }
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::InputData_Frame_PlayBack() { int DataLeft = 0; int DataRequest = 0; int DataRequestOneTime = 0; int nret = 0; //CAutoLock2 lock(&m_cMutex); if(m_playbacklen > 3 * 1024 *1024) DataRequestOneTime = MPEG_TEMP_SIZE; else DataRequestOneTime = MPEG_SMALLTEMP_SIZE; DataLeft = m_playbacklen - m_pos; if( DataLeft >= DataRequestOneTime ) //每次请求的数据不能超过 m_buffer的大小 DataRequest = DataRequestOneTime; else DataRequest = DataLeft; nret = m_streamParser_PlayBack.GetOneFrame((BYTE*)m_buffer, &m_frameHeader); if(nret <= 0) { m_exit = true; TRACE(_T("(存储回放 解包1)error: GetOneFrame<0 ret=%d\r\n"), nret); if( nret == READ_DATA_OVER )//读数据结束 { //等待播放结束 int playRemain = PlayM4_GetSourceBufferRemain(m_index); while (playRemain > 0) { Sleep(8000); playRemain = PlayM4_GetSourceBufferRemain(m_index); } return 0; } return -1; } m_pos += nret; char* pDst = m_buffer; int encFrameLength = nret - m_frameHeader.MetaLength; int nLeft = encFrameLength; while ( nLeft > 0 ) { if( m_exit ) return 0; BOOL bret = PlayM4_InputData(m_index, (BYTE*)pDst, nLeft); if (!bret) { int nErr = PlayM4_GetLastError(m_index); while( nErr == PLAYM4_BUF_OVER ) { Sleep(100); bret = PlayM4_InputData(m_index, (BYTE*)pDst, nLeft); if (!bret) { nErr = PlayM4_GetLastError(m_index); } else { nErr = 0; } } } pDst += nret; nLeft -= nret; if(nLeft > 0) Sleep(1); } if (m_frameHeader.FrameType <= 3)//去掉音频帧 { //取出meta数据,叠加到视频 m_MetaDataLock.Lock(); memcpy( m_meta, &m_frameHeader.MetaLength, sizeof(m_frameHeader.MetaLength)); memcpy( m_meta+sizeof(m_frameHeader.MetaLength), m_buffer + encFrameLength, m_frameHeader.MetaLength ); m_MetaDataLock.Unlock(); while(PlayM4_GetSourceBufferRemain(m_index) > 0)//服务器回放和本地播放一样,数据读取比较快,metaData全读取完了 { ::Sleep(10); } } return 0; }
int CPlayer::InputData_Frame() { int ret = m_streamParser.GetOneFrame((BYTE*)m_buffer, &m_frameHeader); if( ret <= 0 ) { if(m_exit) { //TRACE(_T("CMTVideo::InputData_Frame 退出1 dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d\r\n", // m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager); return -1; } //TRACE(_T("CMTVideo::InputData_Frame <m_streamParser.GetOneFrame Fail> dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d\r\n\r\n", // m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager); //TRACE(_T("!!!!检测到网络出错,准备发送消息 majortype = %d, subtype = %d, m_index_MTManager = %d\r\n\r\n", // m_UniSDKCltInfo.connInfo.dvrType, m_UniSDKCltInfo.connInfo.subType, m_index_MTManager); //::PostMessage(m_hNotifyWnd, WM_NET_ERROR, m_index_MTManager, m_UniSDKCltInfo.connInfo.dvrType << 16 | m_UniSDKCltInfo.connInfo.subType ); //网络异常,接受不到数据给出警告! m_disconnection = true; while(ReStartMonitor()<0)//重新尝试连接并启动监视 { if(m_exit) { return -1; } Sleep(1000); } return -1; //m_exit = true; //return -1; } if(m_exit) { //TRACE(_T("CMTVideo::InputData_Frame 退出2 dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d\r\n", // m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager); return -1; } int encFrameLength = ret - m_frameHeader.MetaLength; BOOL bret = PlayM4_InputData(m_index, (BYTE*)m_buffer, encFrameLength); if (!bret) { int nErr = PlayM4_GetLastError(m_index); if( nErr == PLAYM4_BUF_OVER ) return 0; //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::SetStreamBuf 中 PlayM4_InputData 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); //TRACE(_T("CMTVideo::InputData 退出3 dvrIP = %s Channel = %d m_PlayHandle = %d m_index_MTManager = %d nReceiveOneTime = %dkbps\r\n\r\n", // m_UniSDKCltInfo.connInfo.ip, m_UniSDKCltInfo.channel, m_PlayHandle, m_index_MTManager, nReceiveOneTime); //TRACE(_T("!!!!inputdata<0检测到网络出错,准备发送消息 majortype = %d, subtype = %d, m_index_MTManager = %d\r\n\r\n", // m_UniSDKCltInfo.connInfo.dvrType, m_UniSDKCltInfo.connInfo.subType, m_index_MTManager); //::PostMessage(m_hNotifyWnd, WM_NET_ERROR, m_index_MTManager, m_UniSDKCltInfo.connInfo.dvrType << 16 | m_UniSDKCltInfo.connInfo.subType ); return -nErr; } //取出meta数据,叠加到视频 if (m_frameHeader.FrameType <= 3)//去掉音频帧 { m_MetaDataLock.Lock(); memcpy( m_meta, &m_frameHeader.MetaLength, sizeof(U32)); memcpy( m_meta+sizeof(U32), m_buffer + encFrameLength, m_frameHeader.MetaLength ); m_MetaDataLock.Unlock(); } 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; } } }