您的位置:首页 > 编程语言

DirectShow基础编程 采集视频数据

2010-04-26 10:43 525 查看
视频数据采集大致可以分为四个步骤:

1、创建Capture Graph Builder 和Filter Graph Manager,将两者关联。

2、创建Filter,并添加到Graph中。

3、根据媒体类型等信息连接Filter。

4、运行Graph。

CComPtr<ICaptureGraphBuilder2>	pCapture;
CComPtr<IGraphBuilder>				pGB;
CComPtr<IMediaControl>				pMC;
CComPtr<IMediaEvent>					pME;

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: