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沒有釋放掉就無法使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章