小弟最近再做海康相機的開發,想把SDK中的一個函式封裝起來,遇到一個問題,還請大神看看!
這是我自己的類
class Grab_picture{
public:
Grab_picture();
void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2);
void fRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser);
};
在函式實作的時候遇到這樣的問題
if (!PlayM4_SetDecCallBack(nPort, DecCBFun)) // 獲取資料流
錯誤提示 27 IntelliSense: "void (Grab_picture::*)(long nPort, char *pBuf, long nSize, FRAME_INFO *pFrameInfo, long nReserved1, long nReserved2)" 型別的實參與 "void (__stdcall *)(long nPort, char *pBuf, long nSize, FRAME_INFO *pFrameInfo, long nReserved1, long nReserved2)" 型別的形參不兼容
想法是強制轉換,請問應該怎么轉?
uj5u.com熱心網友回復:
函式引數一樣,那就直接呼叫試試uj5u.com熱心網友回復:
//解碼回呼 視頻為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=https://bbs.csdn.net/topics/PlayM4_InputData(nPort,pBuffer,dwBufSize);
while (!inData)
{
Sleep(10);
inData=https://bbs.csdn.net/topics/PlayM4_InputData(nPort,pBuffer,dwBufSize);
OutputDebugString(L"PlayM4_InputData failed \n");
}
}
break;
}
}
uj5u.com熱心網友回復:
//解碼回呼 視頻為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=https://bbs.csdn.net/topics/PlayM4_InputData(nPort,pBuffer,dwBufSize);
while (!inData)
{
Sleep(10);
inData=https://bbs.csdn.net/topics/PlayM4_InputData(nPort,pBuffer,dwBufSize);
OutputDebugString(L"PlayM4_InputData failed \n");
}
}
break;
}
}
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
這是實時實時預覽回呼,如何接后續的人臉檢測演算法?需要封裝嗎?還是怎么做?有償代做?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256892.html
標籤:其它技術問題
上一篇:創建類后編譯顯示未創建相關檔案
下一篇:C語言檔案使用方式
