[DirectShow] 抓拍图片 收藏
“源于DirectShow自带的例子StillCap”
DirectShow抓拍图片需要用到两个接口:ISampleGrabberCB和ISampleGrabber。"CB"的意思就是 Callback,顾名思义,ISampleGrabberCB接口为ISampleGrabber接口提供回调,其中ISampleGrabberCB 接口的两个方法就是两中回调函数。实现抓拍,根据以下步骤:
1.
- //定义一个类,实现 ISampleGrabberCB接口的BufferCB().
- class CSampleGrabberCB : public ISampleGrabberCB
- {
- STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
- {
- //保存pBuffer中的 数据,此数据即为抓拍的图片
- }
- }
- //创建一个 CSampleGrabberCB的实例
- CSampleGrabberCB mCB;
2.
- // 创建一个ISampleGrabber的实例
- CComPtr< ISampleGrabber > m_pGrabber;
- m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
- //设置媒体类型
- m_pGrabber->SetMediaType(...);
- //把ISampleGrabber添加到Graph中
- CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
- m_pGraph->AddFilter( pGrabBase, L"Grabber" );
- //设置回调函数
- m_pGrabber->SetCallback( &mCB, 1 );
当Graph开始Run的时候,Graph会在每收到一帧数据时调用一次BufferCB,因此,在BufferCB中需要设置一个开关,开始抓拍 图片的时候开启开关,保存完图片以后关闭开关。