Freigeben über


Verwenden von DMOs in DirectShow

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Anwendungen, die auf DirectShow basieren, können DMOs in einem Filterdiagramm über den DMO Wrapper-Filter verwenden. Dieser Filter aggregiert einen DMO und verarbeitet alle Details der Verwendung des DMO, z. B. das Übergeben von Daten an und aus dem DMO, das Zuweisen von IMediaBuffer-Objekten usw.

Da die DMO durch den Filter aggregiert wird, kann die Anwendung den Filter für alle COM-Schnittstellen abfragen, die vom DMO verfügbar gemacht werden. Die Anwendung sollte jedoch den Filter alle Streamingvorgänge auf dem DMO verarbeiten lassen. Legen Sie beispielsweise keine Medientypen fest, verarbeiten Sie keine Puffer, leeren Sie den DMO, sperren Sie die DMO, aktivieren oder deaktivieren Sie die Qualitätskontrolle, oder legen Sie Videooptimierungen fest.

Wenn Sie den Klassenbezeichner (CLSID) einer bestimmten DMO kennen, die Sie verwenden möchten, können Sie den DMO-Wrapperfilter wie folgt mit diesem DMO initialisieren:

  1. Rufen Sie CoCreateInstance auf, um den DMO-Wrapperfilter zu erstellen.
  2. Fragen Sie den DMO-Wrapperfilter für die IDMOWrapperFilter-Schnittstelle ab.
  3. Rufen Sie die IDMOWrapperFilter::Init-Methode auf . Geben Sie die CLSID des DMO und die GUID der Kategorie des DMO an. Eine Liste der DMO-Kategorien finden Sie unter DMO-GUIDs.

Diese Schritte sind im folgenden Code dargestellt:

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

Die DMOEnum-Funktion listet DMOs in der Registrierung auf. Diese Funktion verwendet einen anderen Satz von Kategorie-GUIDs als diejenigen, die für DirectShow-Filter verwendet werden.

Verwenden des Systemgeräteenumerators mit DMOs

Anstatt eine DMO direkt zu erstellen, können Sie den Systemgeräteenumerator verwenden, der jede DMO-Kategorie auflisten kann, die von der DMOEnum-Methode unterstützt wird. Der Systemgeräte-Enumerator enthält auch DMOs, wenn er bestimmte DirectShow-Filterkategorien auflistet. Die folgende Tabelle zeigt die Zuordnung zwischen DMO-Kategorien und DirectShow-Kategorien.

Bezeichnung Wert
DMO-Kategorie DirectShow-Entsprechung
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

Der Systemgeräte-Enumerator gibt eine Liste von Monikerobjekten zurück. Wenn der Moniker ein DMO darstellt, erstellt die IMoniker::BindToObject-Methode automatisch den DMO-Wrapperfilter und initialisiert ihn mit diesem DMO. Somit ist die Tatsache, dass ein DMO beteiligt ist, für die Anwendung transparent. Weitere Informationen zur Verwendung des Systemgeräte-Enumerators finden Sie unter Verwenden des Systemgeräte-Enumerators.

Einschränkungen

Es gibt einige Einschränkungen bei der Verwendung von DMOs in DirectShow:

  • Der DMO Wrapper-Filter unterstützt keine DMOs mit null Eingaben, mehreren Eingaben oder 0 Ausgaben.
  • Alle Pinverbindungen im DMO-Wrapperfilter verwenden die IMemInputPin-Schnittstelle .
  • DirectShow Editing Services unterstützt keine DMO-basierten Effekte oder Übergänge.

Verwenden von DMOs