欢迎来到天天文库
浏览记录
ID:47023411
大小:145.00 KB
页数:38页
时间:2019-06-27
《深入浅出Directshow Filter》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、深入浅出DirectShowFilterFilter概述Filter是一个COM组件,由一个或多个Pin组成。Pin也是一个COM组件。Filter文件的扩展名为.ax,但也可以是.dll。Filter根据其包含Inputpin或Outputpin的情况(或在FilterGraph的位置),大致可分为三类:SourceFilter(仅有Outputpin)、TransformFilter(同时具有Inputpin和Outputpin)和RendererFilter(仅有Inputpin)。一般情
2、况下,创建Filter使用一个普通的Win32DLL项目。而且,一般Filter项目不使用MFC。这时,应用程序通过CoCreateInstance函数Filter实例;Filter与应用程序在二进制级别的协作。另外一种方法,也可以在MFC的应用程序项目中创建Filter。这种情况下,Filter不需注册为COM组件,Filter与应用程序之间的协作是源代码级别的;创建Filter实例,不再使用CoCreateInstance函数,而是直接new出一个Filter对象,如下:m_pFilterO
3、bject=newCFilterClass();//maketheinitialrefcount1tomatchCOMcreationm_pFilterObject->AddRef();因为Filter的基类实现了对象的引用计数,所以即使在第二种情况下,对创建后的Filter对象的操作也完全可以遵循COM标准。Filter是一个独立功能模块,最好不要将Filter依赖于其他第三方的DLL。因为Filter具有COM的位置透明性特点,Filter文件可以放在硬盘的任何位置,只要位置移动后重新注册。
4、但此时,如果Filter依赖其他DLL,则Filter对该DLL的定位就会出现问题。Filter不能脱离FilterGraph单独使用。所以,如果你想绕过FilterGraph直接使用Filter实现的模块功能,请将你的Filter移植成DMO(DirectXMediaObject)。2.Filter的注册Filter是COM组件,所以在使用前一定要注册。Filter的注册程序为regsvr32.exe。如果带上命令行参数/u,表示注销;如果带上是/s,表示不弹出任何注册/注销成功与否的提示对话
5、框。如果你想在BuildFilter项目的时候进行自动注册,请在VC的Projectsettings的CustomBuild页如下设置:Description:RegisterfilterCommands:regsvr32/s/c$(TargetPath)echoregsvr32exe.time>38$(TargetDir)$(TargetName).trgOutputs:$(TargetDir)$(TargetName).trgFilter的注册信息包括两部分:基本的COM信息和Filte
6、r信息。注册信息都存放在注册表中。前者的位置为:HKEY_CLASSES_ROOTCLSIDFilterClsid,后者的位置为:HKEY_CLASSES_ROOTCLSIDCategoryInstanceFilterClsid。COM信息标示了Filter是一个标准的可以通过CoCreateInstance函数创建的COM组件,Filter信息标示了我们通过Graphedit看到的描述这个Filter的信息。如果你不想让Graphedit看到(或者让Filter枚举器找到)你写
7、的Filter,你完全可以不注册Filter信息。而且不用担心,你这么做也完全不会影响Filter的功能。屏蔽注册Filter信息的方法也很简单。因为CBaseFilter实现了IAMovieSetup接口的两个函数:Register和Unregister。我们只需重载这两个函数,直接returnS_OK就行了。(注意:IAMovieSetup是用以注册Filter信息部分的接口,但已经废弃,仅在AMovieDllRegisterServer和AMovieDllUnregisterServer调
8、用才会用到。新写的Filter注册函数一般使用AMovieDllRegisterServer2,这个函数不使用IAMovieSetup接口。如果想要不注册Filter信息,最好自己实现Filter的两个导出函数:DllRegisterServer和DllUnregisterServer,其中只使用RegisterAllServers函数注册OleServer。)Filter的Merit值。这个值是微软的“智能连接”函数使用的。在Graphedit中,当我们加入一个SourceFilter后,在它
此文档下载收益归作者所有