筛选器和筛选器表
DirectShow的构造块是一个软件组件,叫做筛选器。这个软件组件在多媒体软件流上执行一些操作。例如,DirectShow能够:
- 读取文件
- 从视频输入设备捕获视频
- 译解不同的流格式,如MPEG-1视频
- 将数据送给图形卡或声卡
筛选器接收输入并产生输出。例如,如果是一个筛选器解码MPEG-1视频,输入的是MPEG-编码流,输出的是一个解压缩的视频帧序列。
在DirectShow中,一个应用程序执行的任何任务,都是通过连接筛选器链完成的,因此,一个筛选器的输出就成了另一个筛选器的输入。一组连接的筛选器叫做筛选器表。例如,下图显示的就是播放一个AVI文件的筛选器表。
源文件筛选器从硬盘读取AVI文件。AVI分解器将文件解析为两个流,一个压缩的视频流和一个音频流。AVI解压缩器筛选器解码视频帧。视频还原器筛选器使用DirectDraw或GDI向显示器绘制帧。默认的DirectSound设备筛选器使用DirectSound播放音频流。
应用程序不需要得知所有这些数据的流动。相反,筛选器是由一个高级组件叫做筛选器表管理器(Filter Graph Manager)来控制的。应用程序可以进行高级API调用,如Run(从表中移动数据)或Stop(停止数据流动)。如果您需要更多的针对流操作的控制,您可以直接通过COM接口访问筛选器。筛选器表管理器也会向应用程序传递事件通知。
筛选器表管理器的另一个服务目标是:它为应用程序提供方法来生成筛选器表,将筛选器连接在一起。(DirectShow也提供各种帮助对象来简化这个过程。这些在文档中有完整的介绍。)
编写一个DirectShow应用程序
大体上来说,DirectShow应用程序完成的任务有三个。如下表所示:
1、应用程序创建一个筛选器表管理器的实例
2、应用程序使用筛选器表管理器生成一个筛选器表。表中具体的筛选器根据应用程序来确定。
3、应用程序使用筛选器表管理器来控制筛选器表和通过筛选器的流数据。在这个过程中,应用程序还要回应从筛选器表管理器发来的事件。
当处理完成,应用程序释放表管理器和所有的筛选器。
DirectShow是基于COM的;筛选器表管理器和筛选器都是COM对象。在您开始DirectShow编程之前,需要对COM客户端编程有个一般的了解。DirectX SDK文档中的文章<使用COM>是对这个题目的一个很好的介绍。关于COM编程有许多书可以参考。