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.
- Creare un'istanza dell'enumeratore del dispositivo di sistema.
- 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.
- Chiamare IEnumMoniker::Next per recuperare ogni moniker nell'enumerazione .
- 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();
Argomenti correlati