Enumerar efectos y transiciones

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

[Esta API no se admite y puede modificarse o no estar disponible en el futuro].

DirectShow proporciona un objeto Enumerador de dispositivos del sistema para enumerar dispositivos. Puede usarlo para recuperar monikers para efectos o transiciones instalados en el sistema del usuario.

El enumerador de dispositivos del sistema expone la interfaz ICreateDevEnum . Devuelve enumeradores de categorías para las categorías de dispositivo especificadas. Un enumerador de categorías, a su vez, expone la interfaz IEnumMoniker y devuelve monikers para cada dispositivo de la categoría. Para obtener una explicación detallada del uso de ICreateDevEnum, consulte Enumerar dispositivos y filtros. A continuación se muestra un breve resumen específico de DirectShow Editing Services.

Para enumerar los efectos o transiciones, realice los pasos siguientes.

  1. Cree una instancia del enumerador de dispositivos del sistema.
  2. Llame al método ICreateDevEnum::CreateClassEnumerator para recuperar un enumerador de categorías. Las categorías se definen mediante identificadores de clase (CLSID). Use CLSID_VideoEffects1Category para efectos o CLSID_VideoEffects2Category para transiciones.
  3. Llame a IEnumMoniker::Next para recuperar cada moniker de la enumeración.
  4. Para cada moniker, llame a IMoniker::BindToStorage para recuperar su contenedor de propiedades asociado.

El contenedor de propiedades contiene el nombre descriptivo y el identificador único global (GUID) para el efecto o la transición. Una aplicación puede mostrar una lista de nombres descriptivos y, a continuación, obtener el GUID correspondiente.

En el ejemplo de código siguiente se muestran estos pasos.

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();

Trabajar con efectos y transiciones