Поделиться через


Использование dmos в DirectShow

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

Приложения, основанные на DirectShow, могут использовать dmos в графе фильтров с помощью фильтра-оболочки DMO . Этот фильтр агрегирует DMO и обрабатывает все сведения об использовании DMO, такие как передача данных в DMO и из него, выделение объектов IMediaBuffer и т. д.

Так как DMO агрегируется фильтром, приложение может запрашивать в фильтре любые COM-интерфейсы, предоставляемые DMO. Однако приложение должно позволить фильтру обрабатывать все операции потоковой передачи в DMO. Например, не следует задавать типы носителей, обрабатывать буферы, очищать DMO, блокировать DMO, включать или отключать контроль качества или настраивать оптимизации видео.

Если вы знаете идентификатор класса (CLSID) определенного объекта DMO, который вы хотите использовать, можно инициализировать фильтр-оболочку DMO с помощью этого DMO следующим образом:

  1. Вызовите CoCreateInstance , чтобы создать фильтр-оболочка DMO.
  2. Запросите фильтр-оболочку DMO для интерфейса IDMOWrapperFilter .
  3. Вызовите метод IDMOWrapperFilter::Init . Укажите ИДЕНТИФИКАТОР CLSID DMO и GUID категории DMO. Список категорий DMO см. в разделе Идентификаторы GUID DMO.

Следующий код показывает эти действия.

// Create the DMO Wrapper filter.
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
    reinterpret_cast<void**>(&pFilter));

if (SUCCEEDED(hr)) 
{
    // Query for IDMOWrapperFilter.
    IDMOWrapperFilter *pDmoWrapper;
    hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, 
        reinterpret_cast<void**>(&pDmoWrapper));

    if (SUCCEEDED(hr)) 
    {     
        // Initialize the filter.
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); 
        pDmoWrapper->Release();

        if (SUCCEEDED(hr)) 
        {
            // Add the filter to the graph.
            hr = pGraph->AddFilter(pFilter, L"My DMO");
        }
    }
    pFilter->Release();
}

Функция DMOEnum перечисляет dmos в реестре. Эта функция использует набор GUID категории, отличный от тех, которые используются для фильтров DirectShow.

Использование перечислителя системных устройств с динамическими административными адресами

Вместо создания DMO напрямую можно использовать перечислитель системных устройств, который может перечислить любую категорию DMO, поддерживаемую методом DMOEnum . Перечислитель системных устройств также включает dmos при перечислении определенных категорий фильтров DirectShow. В следующей таблице показано сопоставление между категориями DMO и категориями DirectShow.

Метка Значение
Категория DMO Эквивалент DirectShow
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

Перечислитель системных устройств возвращает список объектов моникера. Если моникер представляет DMO, метод IMoniker::BindToObject автоматически создает фильтр-оболочку DMO и инициализирует его с помощью этого DMO. Таким образом, тот факт, что используется DMO, является прозрачным для приложения. Дополнительные сведения об использовании перечислителя системных устройств см. в разделе Использование перечислителя системных устройств.

Ограничения

При использовании dmos в DirectShow существуют некоторые ограничения.

  • Фильтр-оболочка DMO не поддерживает объекты dmos с нулевыми входами, несколькими входами или нулевыми выходными данными.
  • Все соединения закрепления в фильтре-оболочке DMO используют интерфейс IMemInputPin .
  • Службы редактирования DirectShow не поддерживают эффекты или переходы на основе DMO.

Использование динамических административных объектов