Compartilhar via


Enumerando efeitos e transições

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

[Não há suporte para essa API e pode ser alterada ou indisponível no futuro.]

O DirectShow fornece um objeto Enumerador de Dispositivo do Sistema para enumerar dispositivos. Você pode usá-lo para recuperar monikers para efeitos ou transições instalados no sistema do usuário.

O enumerador do dispositivo do sistema expõe a interface ICreateDevEnum . Ele retorna enumeradores de categoria para categorias de dispositivo especificadas. Um enumerador de categoria, por sua vez, expõe a interface IEnumMoniker e retorna monikers para cada dispositivo na categoria. Para obter uma discussão detalhada sobre como usar ICreateDevEnum, consulte Enumerando dispositivos e filtros. Veja a seguir um breve resumo, específico dos Serviços de Edição do DirectShow.

Para enumerar efeitos ou transições, execute as etapas a seguir.

  1. Crie uma instância do enumerador de dispositivo do sistema.
  2. Chame o método ICreateDevEnum::CreateClassEnumerator para recuperar um enumerador de categoria. As categorias são definidas por CLSIDs (identificadores de classe). Use CLSID_VideoEffects1Category para efeitos ou CLSID_VideoEffects2Category para transições.
  3. Chame IEnumMoniker::Next para recuperar cada moniker na enumeração .
  4. Para cada moniker, chame IMoniker::BindToStorage para recuperar seu recipiente de propriedades associado.

O recipiente de propriedades contém o nome amigável e o GUID (identificador global exclusivo) para o efeito ou a transição. Um aplicativo pode exibir uma lista de nomes amigáveis e obter o GUID correspondente.

O exemplo de código a seguir ilustra essas etapas.

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

Trabalhando com efeitos e transições