Condividi tramite


Uso di DMO in DirectShow

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine 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, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Le applicazioni basate su DirectShow possono usare DMO in un grafico di filtro tramite il filtro Wrapper DMO . Questo filtro aggrega un oggetto DMO e gestisce tutti i dettagli dell'uso di DMO, ad esempio il passaggio di dati a e dall'oggetto DMO, l'allocazione degli oggetti IMediaBuffer e così via.

Poiché il DMO viene aggregato dal filtro, l'applicazione può eseguire query sul filtro per qualsiasi interfaccia COM esposta da DMO. Tuttavia, l'applicazione deve consentire al filtro di gestire tutte le operazioni di streaming nel DMO. Ad esempio, non impostare tipi di supporti, elaborare alcun buffer, scaricare DMO, bloccare il DMO, abilitare o disabilitare il controllo qualità o impostare ottimizzazioni video.

Se si conosce l'identificatore di classe (CLSID) di un DMO specifico che si vuole usare, è possibile inizializzare il filtro Wrapper DMO con tale DMO, come indicato di seguito:

  1. Chiamare CoCreateInstance per creare il filtro Wrapper DMO.
  2. Eseguire una query sul filtro Wrapper DMO per l'interfaccia IDMOWrapperFilter .
  3. Chiamare il metodo IDMOWrapperFilter::Init . Specificare CLSID della DMO e il GUID della categoria DMO. Per un elenco di categorie DMO, vedere GUID DMO.

Il codice seguente illustra questi passaggi:

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

La funzione DMOEnum enumera DMO nel Registro di sistema. Questa funzione usa un set diverso di GUID di categoria da quelli usati per i filtri DirectShow.

Uso dell'enumeratore dispositivo di sistema con dmo

Anziché creare direttamente un DMO, è possibile usare l'enumeratore dispositivo di sistema, che può enumerare qualsiasi categoria DMO supportata dal metodo DMOEnum . L'enumeratore dispositivo di sistema include anche dmos quando enumera determinate categorie di filtro DirectShow. Nella tabella seguente viene illustrato il mapping tra categorie DMO e categorie DirectShow.

Etichetta Valore
Categoria DMO DirectShow Equivalente
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

L'enumeratore dispositivo di sistema restituisce un elenco di oggetti moniker. Se il moniker rappresenta un DMO, il metodo IMoniker::BindToObject crea automaticamente il filtro Wrapper DMO e lo inizializza con tale DMO. Pertanto, il fatto che un DMO sia coinvolto è trasparente per l'applicazione. Per altre informazioni sull'uso dell'enumeratore dispositivo di sistema, vedere Uso dell'enumeratore dispositivo di sistema.

Limitazioni

Esistono alcune limitazioni quando si usano dmo in DirectShow:

  • Il filtro wrapper DMO non supporta dmo con zero input, più input o zero output.
  • Tutte le connessioni pin nel filtro wrapper DMO usano l'interfaccia IMemInputPin .
  • DirectShow Editing Services non supporta effetti o transizioni basati su DMO.

Uso di DMO