WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > 开发语言 > VC/MFC

关于视频捕获的两个问题,有源代码。。。
[ 来源: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

 相关文章
·如何在DLL中的线程中执行DLL中的函数?
·在类使用用线程函数
·请教高高高手问题,关于memcpy()
·DLL和ActiveX相比,各自的优缺点是什么?
·求助: SPI里面怎么调用普通socket函数
·求教:DirectDraw窗口模式焦点问题.

 推荐文章
求助--补全代码
如何知道一个线程还在“正常运行”
访问网络出现异常
如何将一个文件夹里的文件组织成xml描述信息
想将一些东东按拼音排序!!
求Debugging application 的sourcecode
vc开发的activex可以在网页中用吗?
请问什么时候需要为资源(例如对话框或按钮)新建一个类?
如何用SQL语言完成复杂字符串的筛选
有关DNS被屏蔽的问题?
MDI程序,如何像VC界面那样,编辑对话框时候在旁边显示标尺?
windows搜索驱动的默认路径是什么
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.