Example #1
0
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;
	}
}
Example #2
0
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;
}
Example #3
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;
			}
        }
    }
}
Example #4
0
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;
		}
	}
}
Example #5
0
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;
}
Example #6
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;
}
Example #7
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;
		}
	}
}