AVICap我把它封装成了一些接口(进程内组件dll),发现封装后,在组件dll里面调用
HWND m_hVideo=capCreateCaptureWindow(NULL,WS_POPUP|WS_VISIBLE,0,0,100,100,NULL,0)
capDriverConnect(m_hVideo,0)
capPreviewRate(m_hVideo,15);
capPreview(m_hVideo,TRUE);
会阻塞进程,当然视频图像更是看不到,是否是AVICap不能被继续封装了?
HWND m_hVideo=capCreateCaptureWindow(NULL,WS_POPUP|WS_VISIBLE,0,0,100,100,NULL,0)
capDriverConnect(m_hVideo,0)
capPreviewRate(m_hVideo,15);
capPreview(m_hVideo,TRUE);
会阻塞进程,当然视频图像更是看不到,是否是AVICap不能被继续封装了?
en,开一个工作线程单独进行处理是可以进行
但发现
capCreateCaptureWindow(NULL,WS_POPUP,0,0,100,100,NULL,0)
我只想捕获数据,不需要预览,发现如果我不让捕获窗口具有WS_VISBLE或者不调用ShowWindow(SW_SHOW)
让捕获窗口显示,帧回调函数根本就不会被调用,怎样让捕获窗口不显示(即隐藏起来,只开启摄像头),然后我想要帧回调函数被调用,即获取采集数据,怎么办?
1、
显示到屏幕范围外围 比如(-1000,-1000,100,100)
2、
隐藏任务栏对应窗口:
SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
struct FrameInfo
{
ULONG uSizeHead; //头部长
ULONG uSizeFrameData; //帧数据长 char errCode; //暂时不用
};
#pragma pack()LRESULT capFrame(HWND hWnd,LPVIDEOHDR lpVHR)
{
................ BITMAPINFO bi[1024*6]={0};
int size=capGetVideoFormat(hWnd,bi,len); //获取视频格式
//网络数据处理
FrameInfo fi;
fi.uSizeHead=size;
fi.uSizeFrameData=lpVHR->dwBufferLength
ret=send((*it)->LR.RemoteView.sockCom,(char*)&fi,sizeof(fi),0); //发送控制头
if(ret>0)
{
ret=send((*it)->LR.RemoteView.sockCom,(char*)&bi,size,0); //发送格式头
ret=send((*it)->LR.RemoteView.sockCom,(char*)lpVHR->lpData,lpVHR->dwBytesUsed);//发送帧数据
}
if(ret<=0)
{
closesocket((*it)->LR.RemoteView.sockCom); //关闭
delete (*it);
pCapInstance->m_lstView.erase(it);
it=pCapInstance->m_lstView.begin();
end=pCapInstance->m_lstView.end();
continue;
}
............
}远程帧信息处理部分代码: FrameInfo fi={0};
int ret=recv(pViewInfo->sockCom,(char*)&fi,sizeof(fi),0); //实时数据不做额外超时
if(ret<=0) break; //退出
if(ret!=sizeof(fi)) continue;
int left=fi.uSizeHead+fi.uSizeFrameData;
char* pos=buffer;
while(left>0)
{
ret=recv(pViewInfo->sockCom,pos,left,0);
if(ret<=0) break;
pos+=ret;
left-=ret;
}
lbi=(LPBITMAPINFOHEADER)buffer;
pFrameData=(LPVOID)(buffer+fi.uSizeHead);
if(!IsWindow(hShowWnd))
{
OutputConsole(" Warning: 非窗口....\r\n");
continue;
}
GetClientRect(hShowWnd,&rc);
HDC hDC=GetDC(hShowWnd);
HDRAWDIB hdd=DrawDibOpen();
if(hdd==NULL)
{
OutputConsole(" warning: hdd=NULL err=%d \r\n",GetLastError());
continue;
}
//::EnterCriticalSection(&pViewInfo->cs);
OutputConsole("\r\n 绘制...... width=%d height=%d\r\n",lbi->biWidth,lbi->biHeight); [color=#FF0000]///下面这个绘制出来的是蓝屏!!!!!!!![color]
DrawDibDraw(hdd,hDC,0,0,
rc.right-rc.left,rc.bottom-rc.top,
lbi,pFrameData,0,0,
lbi->biWidth,lbi->biHeight,
DDF_HALFTONE);
//::LeaveCriticalSection(&pViewInfo->cs);
DrawDibClose(hdd);
ReleaseDC(hShowWnd,hDC);
不好意思,继续求解决(对AVICap不是很熟),远程帧信息传送后,为什么绘制出来的效果是蓝屏的,但直接在本地绘制却是好的(传输到远程后,绘制却是蓝屏)?