graphedt里面的filter怎么才能得到CLSID?

vcbacker 2004-07-06 05:58:22
我在graphedt里面找到了一个XviD mpeg4 codec的filter,
在graphedt里面是可用的,
可是我从它的displayname里面却找不到正确的clsid,
在注册表里搜索也找不到,怎么才能得到这个filter的clsid?
或者有没有这样的ax文件?
...全文
154 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcbacker 2004-07-06
  • 打赏
  • 举报
回复
我刚才仔细看了一下注册表,发现陆老师讲的确实很有道理,真是见多识广啊~~~佩服佩服~~~
vcbacker 2004-07-06
  • 打赏
  • 举报
回复
多谢陆老师,
xvid官方只发布了directshow decode filter,没有 encode的filter,
在他们的论坛上许多外国人也在找这个,
你有没有兴趣写一个出来?应该有很多人都会需要的~~~
happydeer 2004-07-06
  • 打赏
  • 举报
回复
给点例子代码给你!(以下代码摘自《DirectShow实务精选》)

IBaseFilter* pFlt = UDsUtils::CreateCompressor(TRUE, "DivX 5.0.2 Codec");

IBaseFilter * UDsUtils::CreateCompressor(BOOL inIsVideo, const char * inName)
{
GUID guid = inIsVideo ? CLSID_VideoCompressorCategory : CLSID_AudioCompressorCategory;
return CreateHardwareFilter(guid, inName);
}

IBaseFilter * UDsUtils::CreateHardwareFilter(GUID inCategory, const char * inFriendlyName)
{
ICreateDevEnum * enumHardware = NULL;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_ALL,
IID_ICreateDevEnum, (void**)&enumHardware);
if (FAILED(hr))
{
return NULL;
}

IBaseFilter * hardwareFilter = NULL;
IEnumMoniker * enumMoniker = NULL;
hr = enumHardware->CreateClassEnumerator(inCategory, &enumMoniker, 0);
if (enumMoniker)
{
enumMoniker->Reset();

ULONG fetched = 0;
IMoniker * moniker = NULL;
char friendlyName[256];

while (!hardwareFilter && SUCCEEDED(enumMoniker->Next(1, &moniker, &fetched)) && fetched)
{
if (moniker)
{
IPropertyBag * propertyBag = NULL;
VARIANT name;
friendlyName[0] = 0;
hr = moniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&propertyBag);
if (SUCCEEDED(hr))
{
name.vt = VT_BSTR;
hr = propertyBag->Read(L"FriendlyName", &name, NULL);
}
if (SUCCEEDED(hr))
{
WideCharToMultiByte(CP_ACP, 0, name.bstrVal, -1,
friendlyName, 256, NULL, NULL);
if (strcmp(friendlyName, inFriendlyName) == 0)
{
moniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&hardwareFilter);
}
}

// Release interfaces
if (propertyBag)
{
propertyBag->Release();
propertyBag = NULL;
}
moniker->Release();
}
}
enumMoniker->Release();
}
enumHardware->Release();

return hardwareFilter;
}
happydeer 2004-07-06
  • 打赏
  • 举报
回复
哦,那就是XviD mpeg4 codec使用了CLSID_AVI Compressor进行包装,这种filter你不能直接通过clsid去创建;而要枚举Video Compressors目录,然后通过名字匹配找到XviD mpeg4 codec,再将它绑定成一个filter的形式。
vcbacker 2004-07-06
  • 打赏
  • 举报
回复
另外,用你的filter tracer查到的clsid我在注册表里面也曾经找到过,
用它产生的却是CLSID_AVI Compressor,这是为什么?
vcbacker 2004-07-06
  • 打赏
  • 举报
回复
陆老师,我刚才去了xvid的官方网站,发现有很多人在找 xvid 的 directshow encode filter,
xvid自己没有发布这个,据说是因为某些法律问题~~
你有没有做过这个filter?
happydeer 2004-07-06
  • 打赏
  • 举报
回复
用我的filter tracer可以看到。

可以从http://hqtech.nease.net/Software.htm下载“Filter Tracer V1.88版”,然后注册,然后在Graphedit中插入这个filter。打开filter tracer的属性页,就可以察看filter graph中的所有filter了。

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧