Delen via


Effecten en overgangen opsommen

[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

[Deze API wordt niet ondersteund en kan in de toekomst worden gewijzigd of niet beschikbaar.]

DirectShow biedt een System Device Enumerator--object voor het inventariseren van apparaten. U kunt het gebruiken om monikers op te halen voor effecten of overgangen die zijn geïnstalleerd op het systeem van de gebruiker.

De enumerator van het systeemapparaat maakt de ICreateDevEnum interface beschikbaar. Deze retourneert categorie-opsommingen voor opgegeven apparaatcategorieën. Een categorie-enumerator geeft de IEnumMoniker interface weer en retourneert monikers voor elk apparaat in de categorie. Zie Het opsommen van apparaten en filtersvoor een gedetailleerde bespreking over het gebruik van ICreateDevEnum. Hier volgt een korte samenvatting, specifiek voor DirectShow Editing Services.

Voer de volgende stappen uit om effecten of overgangen te inventariseren.

  1. Maak een instantie van de enumerator van systeemapparaten.
  2. Roep de ICreateDevEnum::CreateClassEnumerator methode aan om een categorie-enumerator op te halen. Categorieën worden gedefinieerd door klasse-id's (CLSID's). Gebruik CLSID_VideoEffects1Category voor effecten of CLSID_VideoEffects2Category voor overgangen.
  3. Roep IEnumMoniker::Next om elke moniker op te halen in de opsomming.
  4. Roep voor elke moniker IMoniker::BindToStorage aan om de bijbehorende eigenschappenverzameling op te halen.

De eigenschappentas bevat de beschrijvende naam en de GUID (Globally Unique Identifier) voor het effect of de overgang. Een toepassing kan een lijst met vriendelijke namen weergeven en vervolgens de bijbehorende GUID verkrijgen.

In het volgende codevoorbeeld ziet u deze stappen.

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

Werken met effecten en overgangen