枚举效果和过渡

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

[此 API 不受支持,将来可能会更改或不可用。]

DirectShow 提供用于枚举 设备的系统 设备枚举器对象。 可以使用它检索用户系统上安装的效果或过渡的名字对象。

系统设备枚举器公开 ICreateDevEnum 接口。 它返回指定设备类别的类别枚举器。 类别枚举器反过来公开 IEnumMoniker 接口,并返回类别中每个设备的名字对象。 有关使用 ICreateDevEnum 的详细讨论,请参阅 枚举设备和筛选器。 下面是特定于 DirectShow Editing Services 的简要摘要。

若要枚举效果或切换效果,请执行以下步骤。

  1. 创建系统设备枚举器的实例。
  2. 调用 ICreateDevEnum::CreateClassEnumerator 方法以检索类别枚举器。 类别由 CLSID) (类标识符定义。 将CLSID_VideoEffects1Category用于效果或CLSID_VideoEffects2Category切换效果。
  3. 调用 IEnumMoniker::Next 以检索枚举中的每个名字对象。
  4. 对于每个名字对象,调用 IMoniker::BindToStorage 以检索其关联的属性包。

属性包包含效果或过渡的友好名称和全局唯一标识符 (GUID) 。 应用程序可以显示友好名称的列表,然后获取相应的 GUID。

下面的代码示例演示了这些步骤。

ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;

// Create the System Device Enumerator.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, 
    CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (FAILED(hr))
{
    // Error handling omitted for clarity.
}

// Create an enumerator for the video effects category.
hr = pCreateDevEnum->CreateClassEnumerator(
    CLSID_VideoEffects1Category,  // Video effects category. 
    &pEnumMoniker, 0);               

// Note: Use CLSID_VideoEffects2Category for video transitions.

if (hr == S_OK)  // S_FALSE means the category is empty.
{
    // Enumerate each video effect.
    IMoniker *pMoniker;
    while (S_OK == pEnumMoniker->Next(1, &pMoniker, NULL))
    {
        IPropertyBag *pBag;
        hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
            (void **)&pBag);
        if(FAILED(hr))
        {
            pMoniker->Release();
            continue; // Maybe the next one will work.
        }
        VARIANT var;
        VariantInit(&var);
        hr = pBag->Read(OLESTR("FriendlyName"), &var, NULL);
        if (SUCCEEDED(hr))
        {
            if ( ... )  // Check if var.bstrVal is the name you want.
            {
                VARIANT var2;
                GUID guid;
                var2.vt = VT_BSTR;
                pBag->Read(OLESTR("guid"), &var2, NULL);
                CLSIDFromString(var2.bstrVal, &guid);
                VariantClear(&var2);
                // GUID is now the CLSID for the effect.
            }
        }
        VariantClear(&var);
        pBag->Release();
        pMoniker->Release();
    }
    pEnumMoniker->Release();
}
pCreateDevEnum->Release();

使用效果和切换效果