Перечисление эффектов и переходов

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

[Этот API не поддерживается и может быть изменен или недоступен в будущем.]

DirectShow предоставляет объект перечислителя системных устройств для перечисления устройств. Его можно использовать для получения моникеров для эффектов или переходов, установленных в системе пользователя.

Перечислитель системного устройства предоставляет интерфейс ICreateDevEnum . Он возвращает перечислители категорий для указанных категорий устройств. Перечислитель категорий, в свою очередь, предоставляет интерфейс IEnumMoniker и возвращает моникеры для каждого устройства в категории. Подробное описание использования ICreateDevEnum см. в разделе Перечисление устройств и фильтров. Ниже приведена краткая сводка, относясь к службам редактирования DirectShow.

Чтобы перечислить эффекты или переходы, выполните следующие действия.

  1. Создайте экземпляр перечислителя системного устройства.
  2. Вызовите метод ICreateDevEnum::CreateClassEnumerator , чтобы получить перечислитель категорий. Категории определяются идентификаторами классов (CLSID). Используйте CLSID_VideoEffects1Category для эффектов или CLSID_VideoEffects2Category для переходов.
  3. Вызовите метод IEnumMoniker::Next , чтобы получить каждый моникер в перечислении.
  4. Для каждого моникера вызовите IMoniker::BindToStorage , чтобы получить связанный с ним контейнер свойств.

Контейнер свойств содержит понятное имя и глобальный уникальный идентификатор (GUID) для эффекта или перехода. Приложение может отобразить список понятных имен, а затем получить соответствующий GUID.

Эти шаги показаны в следующем примере кода.

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

Работа с эффектами и переходами