2010-06-11 31 views
2

我有一個示例抓取器掛鉤到我的directshow圖,基於此示例http://msdn.microsoft.com/en-us/library/dd407288(VS.85).aspx問題是它使用一個鏡頭和緩衝區。我想連續抓取樣本,我寧願有一個回調比我猜測的樣本。如何使用回調方法與c + + directshow示例抓取器

如何使用SetCallback方法?

SetCallback(ISampleGrabberCB *pCallback, long WhichMethodToCallback) 

我該如何將pCallback指向我自己的方法?

+1

您好,我有確切的問題,所以可以請你分享抓住樣本的完整代碼?謝謝, – Basel 2014-04-26 11:50:57

+0

是的,如果有一個工作代碼,你會分享嗎? – mbaros 2017-08-10 15:14:46

回答

2

我來自c#背景,並認爲在某個層面上,我可以傳遞一個方法的引用。這似乎並非如此。相反,它要求您創建一個類,它的接口定義了它將調用的方法。然後您將該類的一個實例傳遞給SetCallback方法中的過濾器。當然似乎相比於委託或lambda表達式

這裏長篇大論是一個類實現ISampleGrabberCB的例子

class SampleGrabberCallback : public ISampleGrabberCB 
{ 
public: 
    // Fake referance counting. 
    STDMETHODIMP_(ULONG) AddRef() { return 1; } 
    STDMETHODIMP_(ULONG) Release() { return 2; } 

    STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) 
    { 
     if (NULL == ppvObject) return E_POINTER; 
     if (riid == __uuidof(IUnknown)) 
     { 
      *ppvObject = static_cast<IUnknown*>(this); 
      return S_OK; 
     } 
     if (riid == __uuidof(ISampleGrabberCB)) 
     { 
      *ppvObject = static_cast<ISampleGrabberCB*>(this); 
      return S_OK; 
     } 
     return E_NOTIMPL; 
    } 

    STDMETHODIMP SampleCB(double Time, IMediaSample *pSample) 
    { 
     return E_NOTIMPL; 
    } 

    STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen) 
    { 
     return E_NOTIMPL;  
    } 
}; 
+0

這是做到這一點的方法。 (也許真的實現引用計數..),但這將工作。 – Christopher 2010-06-11 08:44:04

+0

什麼是參考計數處理。它爲什麼如此重要?如果我不這樣做會發生可怕的事情嗎? – 2010-06-11 14:01:02

+0

引用計數函數是確保在正確的時間刪除類的COM標準方法。你可以從MS baseclasses示例項目中的CUnknown繼承,以獲得正確的實現。 – Alan 2010-06-14 15:56:45