由图1可以看到,过滤器是DirectShow最基本的组成元件。过滤器是一个COM组件,是完成DirectShow处理过程的基本单元。DirectShow提供了一组标准的过滤器供应用程序使用,程序开发者也可以创建自定义的过滤器来扩充DirectShow的功能,但必须是以COM形式建立的。DirectX为用户提供了DirectShow基类库(DirectShow Base Class Library),用户自定义的过滤器都可以从基类库提供的基类和接口派生出来。
过滤器主要分为以下几种类型:
首先申明并初始化所需的接口:
// DirectShow interfaces
IGraphBuilder *pGB = NULL;
IMediaControl *pMC = NULL;
IMediaEventEx *pME = NULL;
IVideoWindow *pVW = NULL;
IBasicAudio *pBA = NULL;
IBasicVideo *pBV = NULL;
IMediaSeeking *pMS = NULL;
IMediaPosition *pMP = NULL;
IVideoFrameStep *pFS = NULL;
然后实例化一个过滤器图表管理器,并查询各接口:
// Get the interface for DirectShow's GraphBuilder
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGB);
// QueryInterface for DirectShow interfaces
pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME);
pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS);
pGB->QueryInterface(IID_IMediaPosition, (void **)&pMP);
// Query for video interfaces, which may not be relevant for audio files
pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);
pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV);
// Query for audio interfaces, which may not be relevant for video-only files
pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA);
3、创建过滤器图表
应用DirectShow创建过滤器图表时,用户完全不需要操心系统使用了哪一类过滤器以及过滤器是怎样连接的。只要调用IGraphBuilder::RenderFile函数,就可以建成一个完整的过滤器图表。
// Have the graph builder construct its the appropriate graph automatically
pGB->RenderFile(wFile, NULL);
创建成功后,过滤器图表就可以用来播放多媒体文件了。DirectShow调用IMediaControl::Run函数来播放媒体文件。
// Run the graph to play the media file
pMC->Run();