Combinazione di acquisizione video e anteprima
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine 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, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Le sezioni precedenti descrivono come acquisire video in vari formati di file. La sezione Anteprima video descrive come creare un grafico di anteprima live. Tuttavia, molte applicazioni devono eseguire entrambe contemporaneamente. Per creare un grafico di anteprima e scrittura di file combinato, è sufficiente effettuare due chiamate a ICaptureGraphBuilder2::RenderStream:
// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
NULL, NULL);
// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
NULL, pMux);
In questo codice, Capture Graph Builder nasconde alcuni dettagli:
Se il filtro di acquisizione ha un pin di anteprima o un pin della porta video, oltre a un pin di acquisizione, il metodo RenderStream esegue semplicemente il rendering di entrambi i pin, come illustrato nella figura seguente.
Se il filtro ha solo un pin di acquisizione, Capture Graph Builder usa il filtro Smart Tee per dividere il flusso di acquisizione. La figura seguente mostra il grafico con un tee intelligente.
Il filtro Smart Tee include un pin di acquisizione e un pin di anteprima. Accetta un singolo flusso video dal filtro di acquisizione e lo divide in due flussi, uno per l'acquisizione e uno per l'anteprima. Per mantenere la velocità effettiva nel pin di acquisizione, il pin di anteprima elimina i fotogrammi in base alle esigenze. Estrae anche i timestamp da ogni campione prima di consegnarlo, per i motivi descritti nell'argomento DirectShow Video Capture Filters.
Anche se Smart Tee divide il flusso, non duplica fisicamente i dati video. Usa invece oggetti di esempio multimediali personalizzati che condividono i buffer. Gli esempi sono contrassegnati come "di sola lettura" per garantire che i filtri downstream non vengano scritti sui dati.
Se il grafico di acquisizione ha una finestra di anteprima, diversi elementi possono causare l'arresto dell'intero grafico da parte di Filter Graph Manager, incluso il flusso di acquisizione:
- Blocco del computer.
- Premendo CTRL+ALT+CANC in un computer membro di un dominio.
- Esecuzione di un'applicazione Direct3D a schermo intero, ad esempio un gioco o uno screen saver.
- Cambio di monitor o modifica della risoluzione dello schermo.
- Esecuzione di un programma che determina la visualizzazione di una finestra di dialogo Controllo account utente .Running a program that causes Windows to display a User Account Control (UAC). (Windows Vista o versione successiva).
- Esecuzione di una finestra DOS a schermo intero.
Uno di questi eventi potrebbe interrompere la sessione di acquisizione, causando la perdita di dati. (Ecco cosa accade internamente: il renderer video perde le risorse Direct3D o DirectDraw necessarie. Nel processo di ripristino di tali risorse, il renderer video deve riconnettersi con il filtro upstream, causando l'arresto del grafo da parte di Filter Graph Manager.
Due possibili soluzioni a questo problema sono le seguenti:
- Non includere un flusso di anteprima. Tenere tuttavia presente che il metodo ICaptureGraphBuilder2::RenderStream aggiunge automaticamente una finestra di anteprima quando il dispositivo di acquisizione ha un pin di porta video. Vedere Pin delle porte video in Acquisizione file.
- Usare il motore buffer di flusso per inviare il flusso di anteprima a un grafico in un altro processo.
Argomenti correlati