1、DirectShow的基本工作原理是:将单元组件——Filter串联在一起,然后交由Filter Graph Manager统一控制,系统的一些输入设备、输出设备啊都可以看作是Filter。其实,DirectShow的基本工作单元就是Filter,如:采集设备也是Filter,DirectShow用特殊的包装Filter对它们进行了包装。
WDM Video Capture Filter是WDM驱动模型的采集设备Filter,实现文件是kswdmcap.ax。
VFW Capture Filter是VFW驱动模型的采集设备Filter,实现文件是qcap.dll。
2、采集设备Filter的不同注册目录。Video在Video Capture Sources目录,Audio在Audio Capture Sources目录下,另外WDM Streaming Capture Devices目录包括了以上两个目录的设备以及另外一些采集设备。
3、设备枚举的过程大致如下:
(1)创建一个系统枚举组件(CLSID_SystemDeviceEnum),并获得ICreateDevEnum接口。使用CoCreateInstance函数。
(2)使用接口方法ICreateDevEnum::CreateClassEnumerator为指定目录创建一个枚举器,即IEnumMoniker对象,同时获得IEnumMoniker接口。
(3)使用接口方法IEnumMoniker::Next枚举指定类型目录下所有的设备标识(DeviceMoniker)。每个设备标识对象上都实现了IMoniker接口。实际上可以认为每个设备就是一个IMoniker,它从IEnumMoniker::Next函数中获得实际值,或者说实例,然后可以取得设备的一些属性。
(4)调用IMoniker::BindToStorage之后就可以访问设备标识的属性集了。
(5)调用IMoniker::BindToObject将某个设备标识绑定到一个DirectShow Filter,然后调用IFilterGraph::AddFilter加入到Filter Graph中,这个设备就可以参与工作了。