利用DirectShow开发自己的Filter
2010-07-20 20:46:19 来源:WEB开发网2、给自己的Filter生成一个CLSID
你可以用Guidgen or Uuidgen给自己的Filter生成一个128位的ID号,然后利用DEFINE_GUID宏在Filter的头文件声明该Filter的CLSID;
[myFilter.h]
// {1915C5C7-02AA-415f-890F-76D94C85AAF1}
DEFINE_GUID(CLSID_MYFilter,
0x1915c5c7, 0x2aa, 0x415f, 0x89, 0xf, 0x76, 0xd9, 0x4c, 0x85, 0xaa, 0xf1);
这个CLSID_MYFilter在类厂数组用到,在注册Filter时也要用到。
3、CMyFilter类的简单实现
这个类纯粹为了演示用,所以特别简单,你可以参考我的demo,那个filter写的功能比较全。
CMyFilter::CMyFilter(TCHAR *pName,LPUNKNOWN pUnk,HRESULT *hr)
:CBaseFilter(NAME("my filter"), pUnk, this, CLSID_MYFilter)
{ }
CMyFilter::~CMyFilter()
{}
// Public method that returns a new instance.
CUnknown * WINAPI CMyFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
CMyFilter *pFilter = new CMyFilter(NAME("my Filter"), pUnk, pHr);
if (pFilter== NULL)
{
*pHr = E_OUTOFMEMORY;
}
return pFilter;
}
CBasePin * CMyFilter::GetPin(int n)
{
return NULL;
}
int CMyFilter::GetPinCount()
{
return 0;
}
这样基本上就实现了一个filter,但是这个filter没有与之相联系的PIN,但是实现Filter的基本过程就时这样了,至于逻辑上的东西,比如Filter和pin如何连接,数据流是如何流动的,你都要去看看sdk了,按照上面的步骤你就可以写一个Filter的框架出来。
下面我们总结一下写一个Filter至少需要那些东西。
1、Filter的实现类
在这里就是CMyFilter类,在这个类里你可以实现自己的逻辑上的功能,包括定义你的filter的特性,给你的filter配备pin接口等。
2 com组件的引出函数,五个全局函数:
DllMain //dll的入口函数
DllGetClassObject //获得com组件的类厂对象
DllCanUnloadNow //com组件是否可以卸载
DllRegisterServer //注册com组件
DllUnregisterServer //卸载com组件
其中DllGetClassObject 已经由基类完成,你自己只要完成三个函数即可,
DllMain,DllRegisterServer,DllUnregisterServer。
Tags:利用 DirectShow 开发
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接