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没有释放掉就无法使用。

你可能感兴趣的:(server,null,delete,Graph,Build,CAM)