Enumerazione di effetti e transizioni

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

[Questa API non è supportata e potrebbe essere modificata o non disponibile in futuro.]

DirectShow fornisce un oggetto Enumeratore di dispositivi di sistema per l'enumerazione dei dispositivi. È possibile usarlo per recuperare i moniker per effetti o transizioni installati nel sistema dell'utente.

L'enumeratore del dispositivo di sistema espone l'interfaccia ICreateDevEnum . Restituisce gli enumeratori di categoria per le categorie di dispositivi specificate. Un enumeratore di categoria, a sua volta, espone l'interfaccia IEnumMoniker e restituisce i moniker per ogni dispositivo nella categoria. Per una descrizione dettagliata dell'uso di ICreateDevEnum, vedere Enumerazione di dispositivi e filtri. Di seguito è riportato un breve riepilogo, specifico di DirectShow Editing Services.

Per enumerare effetti o transizioni, seguire questa procedura.

  1. Creare un'istanza dell'enumeratore del dispositivo di sistema.
  2. Chiamare il metodo ICreateDevEnum::CreateClassEnumerator per recuperare un enumeratore di categoria. Le categorie sono definite dagli identificatori di classe (CLSID). Usare CLSID_VideoEffects1Category per effetti o CLSID_VideoEffects2Category per le transizioni.
  3. Chiamare IEnumMoniker::Next per recuperare ogni moniker nell'enumerazione .
  4. Per ogni moniker, chiama IMoniker::BindToStorage per recuperare il contenitore delle proprietà associato.

Il contenitore delle proprietà contiene il nome descrittivo e l'identificatore univoco globale (GUID) per l'effetto o la transizione. Un'applicazione può visualizzare un elenco di nomi descrittivi e quindi ottenere il GUID corrispondente.

L'esempio di codice seguente illustra questi passaggi.

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

Uso di effetti e transizioni