Filtri di acquisizione video 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.

I filtri di acquisizione in DirectShow hanno alcune funzionalità che li distingueno da altri tipi di filtri. Anche se Capture Graph Builder nasconde molti dei dettagli, è consigliabile leggere questa sezione, per avere una conoscenza generale dei grafici di acquisizione DirectShow.

Categorie di pin

Un filtro di acquisizione ha spesso due o più pin di output che forniscono lo stesso tipo di dati, ad esempio un pin di anteprima e un pin di acquisizione. Pertanto, i tipi di supporti non sono un buon modo per distinguere i pin. I pin vengono invece distinti in base alla loro funzionalità, identificata usando un GUID, denominata categoria di pin.

Per una discussione su come eseguire query sui pin per la categoria, vedere Uso delle categorie di pin. Per la maggior parte delle applicazioni, tuttavia, non sarà necessario eseguire query direttamente sui pin. Invece, vari metodi ICaptureGraphBuilder2 accettano parametri che specificano la categoria di pin in cui funzionare. Capture Graph Builder individua automaticamente il pin corretto.

Pin di anteprima e pin di acquisizione

Alcuni dispositivi di acquisizione video hanno pin di output separati per l'anteprima e l'acquisizione. Il pin di anteprima viene usato per eseguire il rendering del video sullo schermo, mentre il pin di acquisizione viene usato per scrivere video in un file.

Un pin di anteprima e un pin di acquisizione presentano le differenze seguenti:

  • Un pin di anteprima elimina i frame in base alle esigenze per mantenere la velocità effettiva nel pin di acquisizione.
  • Ogni frame da un pin di acquisizione viene timestampato con l'ora di flusso in cui è stato acquisito il frame. Un pin di anteprima non restituisce il timestamp degli esempi recapitati.

Il motivo per cui i fotogrammi di anteprima non dispongono di timestamp è che il grafico del filtro introduce una piccola quantità di latenza nel flusso. Se il tempo di acquisizione viene usato come ora di presentazione, il renderer video tratta ogni campione come leggermente tardivo. Ciò può causare l'eliminazione dei fotogrammi del renderer video mentre tenta di recuperare. La rimozione dei timestamp garantisce che il renderer presenti ogni esempio quando arriva, senza eliminare fotogrammi.

La categoria pin per i pin di anteprima è PIN_CATEGORY_PREVIEW. La categoria per i pin di acquisizione è PIN_CATEGORY_CAPTURE.

Pin porta video

Una porta video è una connessione hardware tra un dispositivo video (ad esempio un tuner tv analogico) e la scheda video. Una porta video consente al dispositivo di inviare dati video direttamente alla scheda grafica. Il video viene visualizzato sullo schermo usando una sovrapposizione hardware. Una porta video potrebbe essere un cavo effettivo che connette due dispositivi su schede separate; o potrebbe essere una connessione hard cablata sulla stessa scheda.

Il vantaggio di una porta video è che il video passa direttamente in memoria video, senza alcun lavoro dalla CPU. Tuttavia, le porte video presentano alcuni svantaggi:

  • Una porta video usa sempre la superficie di sovrapposizione durante l'acquisizione, indipendentemente dal fatto che si voglia visualizzare in anteprima il video.
  • Il capovolgimento tra fotogrammi si verifica automaticamente, che rende difficile sincronizzare l'inversione con altre operazioni video.

Se un dispositivo di acquisizione usa una porta video, il filtro di acquisizione include un pin della porta video anziché un pin di anteprima. La categoria di pin per i pin della porta video è PIN_CATEGORY_VIDEOPORT.

Ogni filtro di acquisizione ha almeno un pin di acquisizione. Inoltre potrebbe avere un pin di anteprima o un pin della porta video, ma non entrambi. I filtri possono avere più pin di acquisizione e pin di anteprima, ognuno dei quali offre un tipo di supporto separato. Pertanto, un singolo filtro potrebbe avere un pin di acquisizione video, un pin di anteprima video, un pin di acquisizione audio e un pin di anteprima audio. (Non c'è nulla equivalente a una porta video per l'audio, tuttavia.

Filtri WDM upstream

I dispositivi WDM (Windows Driver Model) possono richiedere alcuni filtri aggiuntivi upstream dal filtro di acquisizione. Questi filtri includono quanto segue:

  • Filtro tuner TV. Controlla l'ottimizzazione per i tuner tv analogici.
  • Filtro audio TV. Controlla le impostazioni audio per i tuner tv analogici.
  • Filtro incrociato video analogico. Instrada i segnali video e audio attraverso il dispositivo hardware. Ad esempio, un dispositivo potrebbe avere più input, ad esempio S-Video e video composito. Il filtro a barra incrociata consente all'applicazione di selezionare l'input.

Anche se questi sono filtri separati in DirectShow, in genere rappresentano lo stesso dispositivo hardware. Ogni filtro controlla una funzione diversa del dispositivo. I filtri sono connessi tramite pin, ma non vengono spostati dati multimediali tra le connessioni pin. Pertanto, i pin su questi filtri non si connettono stabiliscendo un tipo di supporto. Usano invece valori GUID denominati medium. I GUID medi sono definiti in modo univoco per un determinato minidriver del dispositivo. Ad esempio, il filtro Tv Tuner e il filtro Acquisizione video per la stessa scheda TV supportano entrambi lo stesso supporto, che consente all'applicazione di compilare correttamente il grafico.

In pratica, purché si usi ICaptureGraphBuilder2 per compilare i grafici di acquisizione, questi filtri vengono aggiunti automaticamente al grafico. Per una discussione più dettagliata, vedere Filtri driver di classe WDM.

Informazioni sull'acquisizione video in DirectShow