DirectShow 修改CCaptureVideo类,使其支持多次打开

修改类的下载地址:http://download.csdn.net/source/1901412

 

网络上有很多关于这个类的修改,但还是不彻底。具体如下:

 

对于网上流传的CCaptureVideo类而言,它是有问题的,假设我们声明了一个CCaptureVideo类的指针
CCaptureVideo * m_cap ;
然后,在OnInitDialog函数中创建该对象,
m_cap = new CCaptureVideo() ;
然后就是例牌的枚举可用摄像头(m_cap->EnumDevices (m_cam_lst);),或者直接调用init函数
(m_cap->Init(m_cam_lst.GetCurSel (),hWnd);),开始捕获视频数据。
对于缺省的CCaptureVideo而言,第一次这么用是完全没有问题的,可以很容易的把usb摄像头的数据得到。
假定,现在我们按下了“stop”按钮,此时,我们可以用delete m_cap ;可以看到实时显示的那个窗口不见了。这也是正确的。
 
当我们再次开启摄像头的时候,问题就出现了。我们还是按照刚刚一样的顺序初始化m_cap对象,但是这次调用init函数的时候确弹出一个对话框“can't build graph”错误。区区怪事!
 
后来仔细跟踪才知道问题出在:
CComPtr<ISampleGrabber> m_pGrabber;
这个智能指针上面。它第一次工作是正常的,但是第二次就有问题了,似乎是资源没有释放掉。
修改的方法也很简单,直接手工定义:
ISampleGrabber * m_pGrabber ;
...
使用这个指针的代码也需要修改:
原来的初始化代码是:
  hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
我们可以改为:
hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_ISampleGrabber, (void**)&m_pGrabber );
当然,在析构的时候千万不要忘记了:
 SAFE_RELEASE(m_pGrabber);
这样,我们想要开关摄像头多少次都没问题了

 

其实在析构函数的时候还需要加上

 

SAFE_RELEASE(m_pVW);

 

因为m_pVW没有释放掉就无法使用。

CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo CCaptureVideo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值