获得filter的CLSID的几种方法

本文介绍了一种通过注册表查询DirectShow滤镜的方法,并提供了一段示例代码,用于枚举指定类型的滤镜,如解码或编码滤镜。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      这个问题不难,但是似乎没有人写出来,今天有人问我,我就总结了一下。首先要说明的就是filter tracer是不行的,这个问题好像很久以前就看到有人说过,但是自己用filter的时候要不然是枚举,要不然是自己写的,所以完全没有意识到这个情况。
      首先就是查注册表,在HKEY_CURRENT_USER/Software/Microsoft/ActiveMovie/devenum下面有几个分类,各个filter都在里面。比如DivX MPEG-4 Fast-Motion这个filter就在{33D9A760-90C8-11D0-BD43-00A0C911CE86}下面的div4里面。可以看到他的CLSID是D76E2820-1563-11CF-AC98-00AA004C0FA9。

   
      一般在程序里面都是用枚举。下面是一段示例代码:
HRESULT hr;
CComBSTR FilterName(name);
ICreateDevEnum *pSysDevEnum = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void **)&pSysDevEnum);
IEnumMoniker *pEnumCat = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_LegacyAmFilterCategory, &pEnumCat, 0);

if (hr == S_OK)
{
// Enumerate the monikers.
IMoniker *pMoniker;
ULONG cFetched;
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag *pPropBag;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if ( (SUCCEEDED(hr) && wcscmp(FilterName, varName.bstrVal) == 0))
{
pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
hr=pGraph->AddFilter(pFilter, LPCWSTR (name));
break;
}
VariantClear(&varName);
pPropBag->Release();
pMoniker->Release();
}
pEnumCat->Release();
}
pSysDevEnum->Release();

 


    name是一个字符串,用于存放要枚举的filter的FriendlyName。需要注意的是CreateClassEnumerator的时候的CLSID_LegacyAmFilterCategory这个参数是指filter的类型,这里是枚举解码的filter。如果是编码的filter就应该是CLSID_VideoCompressorCategory。

 

  CLSID_LegacyAmFilterCategory对应Directshow Filter,

  而CLSID_VideoCompressorCategory 对应VideoCompressor目录

 

 

 

 

 

<think>我们正在回答如何查看Windows系统中已安装的视频解码器列表(特别是DirectShow相关的解码器)根据用户引用的资料,DirectShow是Windows平台的媒体流处理框架,视频解码器作为DirectShow的Filter组件存在。因此,查看系统中已安装的视频解码器列表,实际上就是查看已注册的DirectShowFilter,特别是解码器Filter方法一:使用GraphEdit工具(微软官方工具,现已不直接提供,但可通过WindowsSDK获得方法二:使用第三方工具(如GraphStudioNext)来查看方法三:使用注册表查看(不推荐普通用户操作)方法四:使用命令行工具(如微软的MSDN工具)但已不再维护考虑到易用性,我们推荐使用GraphStudioNext,因为它是一个开源且持续维护的工具。步骤:1.下载GraphStudioNext(开源工具)地址:https://github.com/cplussharp/graph-studio-next/releases2.安装并运行GraphStudioNext3.在菜单栏选择“Graph”->“Filters...”(或者按Ctrl+F)4.在弹出的过滤器列表对话框中,可以看到系统中所有已注册的DirectShowFilter。5.为了查看解码器,我们可以在“Categories”中选择“VideoDecoders”或者“AudioDecoders”。同时,也可以查看Transform分类(包含解码器、编码器等)。注意:有些解码器可能被归类在“Transform”的“VideoTransform”或“AudioTransform”中。另外,我们也可以使用系统自带的命令行工具(如regedit)查看,但是注册表路径分散,且需要专业知识。路径大致在:视频解码器:HKEY_CLASSES_ROOT\CLSID下的各个FilterCLSID,并在HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32中查看对应的dll路径。以及注册表路径:HKEY_CLASSES_ROOT\DirectShow\Filters由于注册表方式过于复杂且易出错,这里不再赘述。另一个便捷方法是使用DirectShow中的系统枚举API编写简单程序来枚举,但这需要编程能力。因此,我们推荐使用GraphStudioNext。由于用户的问题是关于QT视频播放错误的,因此我们在相关部分可以补充:当QT播放视频出现解码问题时,我们可以使用GraphStudioNext来检查系统是否安装了相应的解码器,并可以尝试手动构建一个播放图,以验证该视频文件是否能在DirectShow框架下播放。接下来,生成相关问题。注意:用户之前的问题是关于QT视频播放错误0x80040266的,我们已经给出了解决方案,现在用户是想检查系统中已安装的解码器列表。我们可以在回答中适当关联之前的错误,比如:如果发现缺少解码器,那么可以安装对应的解码器包来解决之前的问题。但是,由于用户本次问题是独立的“如何查看”,因此我们重点回答查看方法。</think> ### 查看Windows系统中已安装的视频解码器列表方法 在Windows系统中,视频解码器主要通过**DirectShow框架**进行管理和调用。以下是几种实用的检查方法: #### 方法一:使用注册表编辑器(详细列表) 1. 按`Win+R`输入`regedit`打开注册表 2. 导航到关键路径: ```path HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance ``` 3. 此分支包含所有已安装的**DirectShow过滤器**(包括解码器) 4. 每个子项对应一个解码器,查看`FriendlyName`值获取解码器名称 5. 在`FilterData`值中可查看支持的文件格式(十六进制需转换)[^1] #### 方法二:使用专用工具 推荐免费工具: 1. **GraphStudioNext**(开源可视化工具) - 下载地址:https://github.com/cplussharp/graph-studio-next - 启动后选择:`Graph > Insert Filters > Video Decoders` - 显示所有已注册的视频解码器列表 2. **DirectShow Filter Manager** - 下载地址:https://www.videohelp.com/software/DirectShow-Filter-Manager - 支持查看/启用/禁用所有解码器 #### 方法三:命令行检查(需PowerShell) ```powershell # 获取所有视频解码器列表 Get-ChildItem -Path "HKLM:\SOFTWARE\Classes\CLSID" -Recurse | Where-Object { (Get-ItemProperty $_.PSPath)."(default)" -match "Video Decoder|Video Compressor" } | ForEach-Object { $filterName = (Get-ItemProperty $_.PSPath)."(default)" $dllPath = (Get-ItemProperty "$($_.PSPath)\InprocServer32")."(default)" [PSCustomObject]@{ Name = $filterName DLL = $dllPath } } ``` #### 方法四:系统内置验证 1. 创建测试视频文件: ```batch :: 生成空视频文件 fsutil file createnew test.h264 1048576 ``` 2. 使用`ffprobe`检查解码支持: ```batch ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1 test.h264 ``` 3. 若有输出表示系统具备H.264解码能力 --- ### 扩展说明 在DirectShow架构中: - 解码器以**Filter组件**形式注册在系统 - 播放视频时会自动构建Filter Graph连接 - QT框架通过`MFStartup()`初始化Media Foundation - 调用过程:媒体文件 → 源过滤器 → 解码器过滤器 → 渲染器[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值