| 关于视频捕获的两个问题,有源代码。。。 |
| [ 来源:ITWENKU 时间:2006-9-20 16:23:37 | 浏览:298人次
] |
| |
|
先说明我的问题:
1. 如果其它进程正在使用摄像头设备,再启动我的程序,在调用capDriverConnect()的时候,会弹出一个对话框,让你选择合适的视频源,我想,如何去掉这个对话框?即,如果其它进程正在使用这个设备,我就不再去连接这个设备,返回给我一个真或假就可以了,不需要弹出这个框。
2. 我的代码中,调用capDriverDisconnect()函数,返回值为0,不能终止当前的连接,所以执行完这个函数后,再次调用capDriverConnect()的时候,同样会弹出那个“视频源”的选择框(因为capDriverDisconnect没有执行成功),我不知道为什么。
主要代码如下:
//连接摄像头,开始视频采集 BOOL Initialize() { char devname[100],devversion[100]; char str[200]; int index=0;
m_capwnd = capCreateCaptureWindow("Capture",WS_POPUP,0,0,1,1,0,0); if(m_capwnd==NULL) { return FALSE; }
//下面的OnCaptureVideo是一个回调函数。 capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo); capGetDriverDescription(index,devname,100,devversion,100);
// Connect to webcam driver if( ! capDriverConnect(m_capwnd,index) ) { m_capwnd=NULL; return FALSE; }
// Set the capture parameters if(SetCapturePara()==FALSE)//此函数下面有代码 { capDriverDisconnect(m_capwnd); return FALSE; } return TRUE; }
//回调函数 LRESULT CALLBACK OnCaptureVideo(HWND mwnd,LPVIDEOHDR lphdr) { //做一些事情,显示图像或网络传输 return TRUE;
} //设置相关参数 BOOL SetCapturePara() { CAPTUREPARMS CapParms={0};
capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms));
CapParms.fAbortLeftMouse = FALSE; CapParms.fAbortRightMouse = FALSE; CapParms.fYield = TRUE; CapParms.fCaptureAudio = FALSE; CapParms.wPercentDropForError = 50;
if(capCaptureSetSetup(m_capwnd,&CapParms,sizeof(CapParms))==FALSE) { return FALSE; }
// Set Video Format
capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));
m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH; m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;
BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));
if(ret==TRUE) return TRUE; }
//关闭连接 void Destroy() {
if(m_capwnd==NULL) return; bool ret = 1; // Stop the capturing process ret = capSetCallbackOnVideoStream(m_capwnd, NULL);//返回0 ret = capCaptureAbort(m_capwnd);//返回1 ret = capCaptureStop(m_capwnd); //返回1 // Finally disconnect the driver ret = capDriverDisconnect(m_capwnd);//返回0 int error = GetLastError();//error为0 }
工作是没问题,能正常采集到图象,只是当关闭连接时,即执行Destroy()后,capDriverDisconnect()似乎不能正常关闭,返回值为0。 所以,执行完Destroy()后,再次执行Initialize(),就会提示选择“视频源”,因为设备没有正常关闭。
所以,会有上面提到的两个问题。。。。如何解决?谢谢~~
1.这是没办法的,应用程序间必须协商此冲突 2.capDriverDisconnect之前,请先关闭Preview和Capture
顶!
第2个问题我已经解决,方法是必须要Sleep()足够的时间,在capDriverDisconnect之前。
第1个问题,我认为肯定有办法解决!!因为原来打印程序时,就遇到过类似的情况,可以去掉打印设置对话框,而直接打印。。。 这个我认为应该有办法。
don't use WDM, use Directshow
关键是我已经用wdm了, 重写代码不现实。
没人会吗?
第一个问题我觉得只有厂家改驱动才有可能(也只是可能);
WDM does not support this
|
|
 |
推荐文章 |
|