海康轉碼

//解碼回調 視頻爲YUV數據(YV12),音頻爲PCM數據
void CALLBACK DecCBFun(long nPort,char * pBuf,long nSize,FRAME_INFO * pFrameInfo, long nReserved1,long nReserved2)
{
 	long lFrameType = pFrameInfo->nType;	

  if(lFrameType ==T_YV12)
  {
	Mat frame;
	frame.create(Size(pFrameInfo->nWidth, pFrameInfo->nHeight),CV_8UC1);
	memcpy(frame.data, pBuf, pFrameInfo->nWidth*pFrameInfo->nHeight);
	imshow("IP Camera", frame);
	waitKey(1);
  }
}


///實時流回調
void CALLBACK fRealDataCallBack(LONG lRealHandle,DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize,void *pUser)
{
  DWORD dRet;
  switch (dwDataType)
  {
  case NET_DVR_SYSHEAD:    //系統頭
    if (!PlayM4_GetPort(&nPort)) //獲取播放庫未使用的通道號
    {
      break;
    }
    if(dwBufSize > 0)
    {
      if (!PlayM4_OpenStream(nPort,pBuffer,dwBufSize,1024*1024))
      {
        dRet=PlayM4_GetLastError(nPort);
        break;
      }
      //設置解碼回調函數 只解碼不顯示
 			if (!PlayM4_SetDecCallBack(nPort,DecCBFun))
 			{
 				dRet=PlayM4_GetLastError(nPort);
 				break;
 			}
    
      //設置解碼回調函數 解碼且顯示
      //if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL))
      //{
      //	dRet=PlayM4_GetLastError(nPort);
      //	break;
      //}

      //打開視頻解碼
      if (!PlayM4_Play(nPort,hWnd))
      {
        dRet=PlayM4_GetLastError(nPort);
        break;
      }

      //打開音頻解碼, 需要碼流是複合流
      if (!PlayM4_PlaySound(nPort))
      {
        dRet=PlayM4_GetLastError(nPort);
        break;
      }		
    }
    break;
    
  case NET_DVR_STREAMDATA:   //碼流數據
    if (dwBufSize > 0 && nPort != -1)
    {
      BOOL inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
      while (!inData)
      {
        Sleep(10);
        inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
        OutputDebugString(L"PlayM4_InputData failed \n");	
      }
    }
    break;	
  }		
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章