如何使用c ++ directshow示例抓取器的回调方法

时间:2010-06-11 00:09:57

标签: c++ directshow webcam

我有一个示例抓取器挂钩到我的directshow图表,根据这个例子http://msdn.microsoft.com/en-us/library/dd407288(VS.85).aspx,问题是它使用了一个镜头和缓冲区。我想继续抓取样本,而我宁愿回调,而不是我猜测样本。

如何使用SetCallback方法?

SetCallback(ISampleGrabberCB *pCallback, long WhichMethodToCallback)

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

1 个答案:

答案 0 :(得分: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;    
    }
};