视频数据采集大致可以分为四个步骤:
1、创建Capture Graph Builder 和Filter Graph Manager,将两者关联。
2、创建Filter,并添加到Graph中。
3、根据媒体类型等信息连接Filter。
4、运行Graph。
CComPtr<IBaseFilter> pSource;
CComPtr<IBaseFilter> pRender;
CComPtr<IBaseFilter> pDecompressor;
///1、创建Capture Graph Builder 和Filter Graph Manager,将两者关联///
CoCreateInstance(
CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
(void**)&pCapture.p );
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pGB.p);
pCapture->SetFiltergraph(pGB);
///2、创建Filter,并添加到Graph中////////////////////////////////////
//第一步,寻找采集设备,创建Source Filter
//在FindCapture函数中实现
//可以通过系统枚举器枚举、Filter Mapper、CLSID等三种方式找到
FindCapture(pSource);
//第二步,创建Render Filter
//类CMyRender实现Render Filter
//这个类可以实现为将视频数据写入进程共享空间供其他进程使用
//也可以实现为将视频数据写入文件,等等
CMyRender* pMyRender = new CMyRender();
pRender = pMyRender;
//第三步,创建Translate Filter
//这是DirectShow提供的一个接口
//如果视频数据是YUV等格式,则需要使用这个类
CoCreateInstance(
CLSID_AVIDec, NULL, CLSCTX_INPROC,
IID_IBaseFilter, (void **) &(pDecompressor.p));
//第四步,把三个Filter添加到Graph中
pGB->AddFilter(pSource,L"Video Capture");
pGB->AddFilter(pDecompressor,L"Color Format Convert");
pGB->AddFilter(pRender,L"Video Receive");
///3、根据媒体类型等信息连接Filter////////////////////////////////////
//ConnectFilter函数用来连接GraphBuild中的两个Filter,这个函数需要实现
//VideoType是数据类型,通过其他方式获得
if(VideoType == VF_RGB24)
{
ConnectFilter(pCapture,pSource,pRender);
}
else if(VideoType == VF_YUV2)
{
ConnectFilter(pCapture,pSource,pDecompressor);
ConnectFilter(pCapture,pDecompressor,pRender);
}
///4、运行Graph////////////////////////////////////////////////////////////
pGB.QueryInterface(&pMC);
pGB.QueryInterface(&pME);
pMC->Run();