参考:
http://blog.csdn.net/yulinxx/article/details/49756399
http://blog.csdn.net/wangqiulin123456/article/details/8393358(demo)
http://blog.csdn.net/mao0514/article/details/39673119
http://blog.chinaunix.net/uid-23883288-id-3034573.html !!!!
http://www.cnblogs.com/lidabo/p/3701959.html (音频采集)
所有DirectShow 程序都使用下表中的头文件。
dshow.h
所有DirectShow 程序。
有些DirectShow接口会要求其他头文件,你可以去查看这些接口的参考手册。库文件
提供类标识(CLSIDs)和接口表示(IIDs)。所有的DirectShow程序都要求使用该库文件
Quartz.lib
提供AMGetErrorText函数,如果你不调用这个函数,就可以不加载该库文件。
irectShow中,数据流(Data Flow)都是依次流过各个Filter的.它对数据的管理也有自己的方法,而且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频采集在的每帧为位图数据为例,说说如何在Directshow中提取数据.
这里我们用到了DirectShow提供给我们的接口ISampleGrabber,并定义了一个供它回调的CSampleGrabberCB对象(继承ISampleGrabberCB接口).
我们知道,DirectShow中的数据存储是通过Sample完成的,所以提取数据也需要通过SampleGrabber.
步骤如下:
class CSampleGrabberCB : public ISampleGrabberCB
{
STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
//Callback method that receives a pointer to the sample buffer.
}
STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
{
//Callback method that receives a pointer to the media sample.
}
}
CComPtr< ISampleGrabber > m_pGrabber;
HRESULT hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
if(FAILED(hr))
//error action;
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
CMediaType VideoType;
VideoType.SetType(&MEDIATYPE_Video);
VideoType.SetSubtype(&MEDIASUBTYPE_RGB24);
hr = m_pGrabber->SetMediaType(&VideoType);
hr = pGraph->AddFilter(pGrabBase,L"Grabber");
// don't buffer the samples as they pass through
hr = m_pGrabber->SetBufferSamples( FALSE );
// only grab one at a time, stop stream after
// grabbing one sample
hr = m_pGrabber->SetOneShot( FALSE );
// set the callback, so we can grab the one sample
hr = m_pGrabber->SetCallback( &mCB, 1 ); //mCB为CSampleGrabber对象
这样,在DirectShow数据流动过程中,mCB.bufferCB会自动执行,提取Graph中的数据.