Share via


Passaggio 1. Scegliere una classe di base

[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.

Questo è il passaggio 1 dell'esercitazione Scrittura di filtri di trasformazione.

Supponendo che si decida di scrivere un filtro e non un DMO, il primo passaggio consiste nella scelta della classe di base da usare. Le classi seguenti sono appropriate per i filtri di trasformazione:

  • CTransformFilter è progettato per i filtri di trasformazione che usano buffer di input e output separati. Questo tipo di filtro viene talvolta chiamato filtro di trasformazione copia. Quando un filtro di trasformazione copia riceve un esempio di input, scrive nuovi dati in un esempio di output e distribuisce l'esempio di output al filtro successivo.

  • CTransInPlaceFilter è progettato per i filtri che modificano i dati nel buffer originale, chiamati anche filtri sul posto trans-in-place. Quando un filtro sul posto trasposto riceve un esempio, modifica i dati all'interno di tale esempio e restituisce lo stesso campione downstream. Il pin di input e il pin di output del filtro si connettono sempre ai tipi di supporti corrispondenti.

  • CVideoTransformFilter è progettato principalmente per i decodificatori video. Deriva da CTransformFilter, ma include funzionalità per l'eliminazione di fotogrammi se il renderer downstream cade dietro.

  • CBaseFilter è una classe di filtro generica. Tutte le altre classi in questo elenco derivano da CBaseFilter. Se nessuno di essi è adatto, è possibile tornare a questa classe. Tuttavia, questa classe richiede anche la maggior parte del lavoro nella tua parte.

  • ! [Importante]

    Le trasformazioni video sul posto possono avere un impatto grave sulle prestazioni di rendering. Le trasformazioni sul posto richiedono operazioni di lettura-modifica-scrittura nel buffer. Se la memoria si trova in una scheda grafica, le operazioni di lettura sono significativamente più lente. Inoltre, anche una trasformazione di copia può causare operazioni di lettura non intenzionali se non lo si implementa attentamente. È quindi consigliabile eseguire sempre test sulle prestazioni se si scrive una trasformazione video.

     

Per il codificatore RLE di esempio, la scelta migliore è CTransformFilter o CVideoTransformFilter. Infatti, le differenze tra di esse sono in gran parte interne, quindi è facile convertire da una all'altra. Poiché i tipi di supporti devono essere diversi nei due pin, la classe CTransInPlaceFilter non è appropriata per questo filtro. Questo esempio userà CTransformFilter.

Avanti: Passaggio 2. Dichiarare la classe Filter.

Scrittura di filtri DirectShow