Énumération des effets et des transitions

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

[Cette API n’est pas prise en charge et peut être modifiée ou indisponible à l’avenir.]

DirectShow fournit un objet Énumérateur de périphériques système pour l’énumération des appareils. Vous pouvez l’utiliser pour récupérer les monikers pour les effets ou les transitions installés sur le système de l’utilisateur.

L’énumérateur de périphérique système expose l’interface ICreateDevEnum . Elle retourne des énumérateurs de catégorie pour les catégories d’appareils spécifiées. Un énumérateur de catégorie, à son tour, expose l’interface IEnumMoniker et retourne des monikers pour chaque appareil de la catégorie. Pour une présentation détaillée de l’utilisation de ICreateDevEnum, consultez Énumération d’appareils et de filtres. Voici un bref résumé, spécifique aux services d’édition DirectShow.

Pour énumérer des effets ou des transitions, procédez comme suit.

  1. Créez un instance de l’énumérateur de périphérique système.
  2. Appelez la méthode ICreateDevEnum::CreateClassEnumerator pour récupérer un énumérateur de catégorie. Les catégories sont définies par des identificateurs de classe (CLSID). Utilisez CLSID_VideoEffects1Category pour les effets ou CLSID_VideoEffects2Category pour les transitions.
  3. Appelez IEnumMoniker::Next pour récupérer chaque moniker dans l’énumération.
  4. Pour chaque moniker, appelez IMoniker::BindToStorage pour récupérer son conteneur de propriétés associé.

Le conteneur de propriétés contient le nom convivial et l’identificateur global unique (GUID) pour l’effet ou la transition. Une application peut afficher une liste de noms conviviaux, puis obtenir le GUID correspondant.

L’exemple de code suivant illustre ces étapes.

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

Utilisation des effets et des transitions