作者:时间证明一2602891163 | 来源:互联网 | 2023-05-17 09:12
怎样从这个接口继承下来,实现其中的二个回调函数呀?
5 个解决方案
你看一下SDK的例子: samples\multimedia\directshow\editing\StillCap
对,楼上说的例子就是第二个回调函数的例子,这个例子给出了三个参数,第一个是样例间隔时间,感觉用处不大,第2。3个一个是样例的数据区指针,一个是数据区域的长度,你可以在过滤器图中先注册好这个回调函数,然后每一次一帧数据到达时候系统自动调用这个函数,这样你只要在函数里面加入适当的语句就可以对每一个样例数据进行处理,不如保存到硬盘,送管道。。。。。。。。。
STDMETHODIMP CSampleGrabberCB::BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
找到 了,可以实现,谁知道怎么添加压缩FILTER在捕获时???
如何设置捕获的数据格式,(帧率,色彩位数,大小等?)
class CSampleGrabberCB : public ISampleGrabberCB
{
private:
CVideoCap *m_pfather;
public:
CSampleGrabberCB( )
{
;
}
int SetFather(CVideoCap *p)
{
this->m_pfather=p;
return 0;
}
STDMETHODIMP_(ULONG) AddRef() { return 2; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
{
if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown )
{
*ppv = (void *) static_cast ( this );
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
{
return 0;
}
STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
return this->m_pfather->OnCapture((char *)pBuffer,(unsigned long)lBufferSize);
}
};
class CSampleGrabberCB : public ISampleGrabberCB
{
private:
CVideoCap *m_pfather;
public:
CSampleGrabberCB( )
{
;
}
int SetFather(CVideoCap *p)
{
this->m_pfather=p;
return 0;
}
STDMETHODIMP_(ULONG) AddRef() { return 2; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
{
if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown )
{
*ppv = (void *) static_cast ( this );
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
{
return 0;
}
STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
return this->m_pfather->OnCapture((char *)pBuffer,(unsigned long)lBufferSize);
}
};