directshow 功能
为了让应用程序开发人员从复杂的数据传输,硬件差异,同步性等工作中解脱出来。
directshow系统构成
directshow系统位于应用曾,使用一种filter graph的模型管理整个数据流的处理过程。参与数据处理的各个功能模块叫做filter,各个filter在filter graph中按一定的顺序连接成一条流水型协同工作。
filter分类
1、source filters:负责获取数据,数据源可以是文件,因特网计算机里的采集卡(WDM驱动或者VFW驱动)数字摄像机等
2、transform filters:数据格式转换,数据的分离/合成,解码/编码等
3、Rendering filters:负责数据的最终去向,数据送给显卡,声卡进行多媒体掩饰,输出到文件存储。
1.3Com编程基础
COM规范规定,任何组建或者接口都需要从IUnknow接口中继承而来,从IUnknown定义3个重要函数,QueryInterface,Addref和Release,
1.QueryInterface负责对象上的接口查询,
2、Addref负责增加引用计数,
3、Release用于减少引用计数。
4、引用计数解决了组建对象生命周期问题,即Com组建什么时候被销毁,由谁来销毁的问题。
PS,Com组件一般会采用一个“自销毁”的策略,可以看到很多IUnknown:Release函数的实现,当引用计数为0时,组建对象会调用Delete this指令。
Com组件实际上是一个C++类,对于组件的外部使用者来说,这个类名一般不可知,那么如何创建这个类的实例,COM规范规定,每个组建都必须实现一个与之相对应的类工厂(Class factory),类工厂也是一个COM组件,实现IClassfactory接口,在IClassfactory接口函数CreateInstance中,才能使用new操作生成一个Com组建类对象的实例。
Com组件类型
1、进程内组建,
2、本地进程组件
3、远程组件
Filter一般是一种进程内组建,以DLL的形式提供服务。
一个典型的自注册COM组建DLL所必需的5导出函数如下:
1、DLLMAIN:DLL入口函数(DirectShow实现的是DLLEntryPoint)
2、DLLGetClassObject:用于获得类工厂指针
3、DllCanUnloadNow:系统空闲时会调用这个函数,以确定是否可以卸载DLL
4、DLLRegisterServer:将COM组件注册到注册表中
5、DllUnregisterServer:删除注册表中COM组件的注册信息。