Share via


Introduzione allo sviluppo di filtri 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.

Questa sezione descrive brevemente le attività coinvolte nello sviluppo di un filtro DirectShow personalizzato. Fornisce anche collegamenti ad argomenti che illustrano queste attività in modo più dettagliato. Prima di leggere questa sezione, leggere gli argomenti in About DirectShow, che descrivono l'architettura DirectShow complessiva.

Libreria di classi di base DirectShow

DirectShow SDK include un set di classi C++ per la scrittura di filtri. Anche se non sono necessari, queste classi sono il modo consigliato per scrivere un nuovo filtro. Per usare le classi di base, compilarle in una libreria statica e collegare il file lib al progetto, come descritto in Compilazione di filtri DirectShow.

La libreria di classi di base definisce una classe radice per i filtri, la classe CBaseFilter . Diverse altre classi derivano da CBaseFilter e sono specializzate per determinati tipi di filtri. Ad esempio, la classe CTransformFilter è progettata per i filtri di trasformazione. Per creare un nuovo filtro, implementare una classe che eredita da una delle classi di filtro. Ad esempio, la dichiarazione di classe potrebbe essere la seguente:

class CMyFilter : public CTransformFilter
{
private:
    /* Declare variables and methods that are specific to your filter.
public:
    /* Override various methods in CTransformFilter */
};

Per altre informazioni sulle classi di base DirectShow, vedere gli argomenti seguenti:

Creazione di pin

Un filtro deve creare uno o più pin. Il numero di pin può essere fisso in fase di progettazione oppure il filtro può creare nuovi pin in base alle esigenze. I pin derivano in genere dalla classe CBasePin o da una classe che eredita CBasePin, ad esempio CBaseInputPin. I pin del filtro devono essere dichiarati come variabili membro nella classe di filtro. Alcune classi di filtro definiscono già i pin, ma se il filtro eredita direttamente da CBaseFilter, è necessario dichiarare i pin nella classe derivata.

Negoziazione delle connessioni pin

Quando Filter Graph Manager tenta di connettere due filtri, i pin devono accettare diverse cose. Se non è possibile, il tentativo di connessione ha esito negativo. In genere, i pin negoziano quanto segue:

  • Transport. Il trasporto è il meccanismo che i filtri useranno per spostare esempi multimediali dal pin di output al pin di input. Ad esempio, possono usare l'interfaccia IMemInputPin ("modello push") o l'interfaccia IAsyncReader ("modello pull").
  • Tipo di supporto. Quasi tutti i pin usano tipi di supporti per descrivere il formato dei dati che verranno recapitati.
  • Allocatore. L'allocatore è l'oggetto che crea i buffer che contengono i dati. I pin devono accettare quale pin fornirà l'allocatore. Devono inoltre accettare le dimensioni dei buffer, il numero di buffer da creare e altre proprietà del buffer.

Le classi di base implementano un quadro per questi negoziati. È necessario completare i dettagli eseguendo l'override di vari metodi nella classe base. Il set di metodi che è necessario eseguire l'override dipende dalla classe e dalla funzionalità del filtro. Per altre informazioni, vedere Modalità di connessione dei filtri.

Elaborazione e distribuzione di dati

La funzione primaria della maggior parte dei filtri consiste nel elaborare e distribuire dati multimediali. In che modo si verifica dipende dal tipo di filtro:

  • Un'origine push include un thread di lavoro che riempie continuamente campioni con dati e li fornisce a valle.
  • Un'origine pull attende che il relativo vicino downstream richieda un esempio. Risponde scrivendo dati in un esempio e fornendo l'esempio al filtro downstream. Il filtro downstream crea il thread che determina il flusso di dati.
  • Un filtro di trasformazione include esempi recapitati dal relativo vicino a monte. Quando riceve un esempio, elabora i dati e lo distribuisce downstream.
  • Un filtro renderer riceve esempi da upstream e li pianifica per il rendering in base ai timestamp.

Altre attività correlate allo streaming includono lo scaricamento dei dati dal grafico, la gestione della fine del flusso e la risposta alle richieste di ricerca. Per altre informazioni su questi problemi, vedere gli argomenti seguenti:

Supporto com

I filtri DirectShow sono oggetti COM, in genere inseriti in pacchetti nelle DLL. La libreria di classi di base implementa un framework per supportare COM. Viene descritto nella sezione DirectShow e COM.

Scrittura di filtri DirectShow