DirectShow Filter
DirectShow使用一个模块化的架构,每个处理过程都由一个叫做filter的COM对象来实现。DirectShow为应用程序提供了一系列标准的filter,开发者也可编写自己的filter来扩展DirectShow的功能。下面是播放一个AVI文件的步骤:
·从文件中读取数据并转换成字符流(File Source filter)
·检查AVI头,分析字节流并将它们分离成视频和音频(AVI Aplitter filter)
·将视频解码(不同的解码filter,取决于不同的压缩格式)
·将视频显示出来(Video Render filter)
·将音频送入声卡(Default DirectSound Device filter)
每个filter与一个或多个其他的filter相连,其中的连接点也是一个COM对象,称作Pin,filter使用Pin将数据从一个filter转移到另一个。在DirectShow中,这一系列连接在一起的filter称作filter graph。
Filter可能处于三种不同的状态:运行、停止和暂停状态。filter在运行状态时处理数据,停止状态时停止处理数据,暂停状态则是表示就绪,可以开始进入运行状态。除了极个别的情况,一个filter Graph中的所有filter通常都处在同一个状态下,因此,filter graph也可以称其处于运行、停止、暂停状态。
Filter可以被分为几个大的种类:
·source filter: filter graph的数据源,这些数据可以来自文件,网络,摄像头或任何其它东西。每一个source filter操作不同类型的数据源。
·transform filter:接收数据,处理数据并将它送入下一个filter。编码filter和解码filter都属于这个种类。
·Renderer filter:处于filter链的末端,接收数据并将其展现给用户。比如,一个视频render在显示器上回执视频图像;一个音频renderer将音频数据送入声卡;一个写文件filter(file-writer filter)将数据存盘。
·splitter filter:分析输入的数据流并将其分解成两路或多路,比如,AVI splitter分析字节流并将其分解成视频流和音频流。
·mux filter:将多路输入流合并成一路。比如,AVI Mux正好与AVI splitter做相反的工作,它将视频和音频流合成一个AVI格式字节流。
以上的分类并不是绝对的,比如,ASF Reader Filter同时充当了source filter和splitter filter的角色。
所有的DirectShow filter都提供IBaseFilter接口,所有的Pin也都提供IPin接口。DirectShow也定义了许多其它的接口以实现特定的功能。
Filter Graph Manager
Filter Graph Manager是一个用以控制filter graph中的filter的COM对象。它提供了许多功能,包括:
·协调filter之间的状态变化
·建立参考时钟(reference clock)
·将事件返回给应用程序
·提供应用程序建立filter graph的方法
状态变化