Share via


Acquisire DV in RGB non compresso

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

In questo esempio viene illustrato come acquisire LA DV dal file e salvarlo in un file come RGB non compresso durante l'anteprima. Usare il grafico del filtro illustrato nel diagramma seguente.

acquisizione di rgb non compressi nel file

Il filtro Splitter DV suddivide l'audio/video interleaved in flussi audio e video separati Il video con codifica DV passa al filtro DV Video Decoder , che restituisce video RGB non compressi. Il video RGB viene instradato tramite il filtro Smart Tee al filtro Mux AVI (per l'acquisizione) e al renderer video (per l'anteprima). Nel frattempo, il flusso audio dal splitter DV passa attraverso il filtro Infinite Pin Tee al mux AVI e al renderer audio. Filter Graph Manager mantiene sincronizzati tutti questi flussi, usando i timestamp negli esempi e l'orologio di riferimento del grafico.

Questo grafico potrebbe sembrare inutilmente complicato, ma garantisce che il flusso video con codifica DV venga decodificato una sola volta, riducendo al minimo i requisiti di CPU. Si noti inoltre che il video passa attraverso il filtro Smart Tee mentre l'audio passa attraverso il filtro Infinite Pin Tee. Smart Tee può eliminare i fotogrammi di anteprima per migliorare le prestazioni di acquisizione, che è auspicabile per il video, ma non per l'audio, in cui i campioni eliminati sono molto evidenti. Inoltre, poiché l'audio richiede una larghezza di banda molto inferiore rispetto al video, c'è relativamente poca possibilità di eliminare l'audio nel file.

È necessario compilare questo grafico una sezione alla volta, ma il metodo RenderStream può comunque essere utile. Usare il codice seguente:

// Build the file-writing section of the graph.
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, 
    OLESTR("C:\\Example3.avi"), &pMux, 0);

// MSDV to DV splitter.
IBaseFilter *pDVSplit;  // Create the DV Splitter (CLSID_DVSplitter)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);

// Splitter to DV Decoder to Smart Tee.
IBaseFilter *pDVDec; // Create the DV Decoder (CLSID_DVVideoCodec)
IBaseFilter *pSmartTee; // Create the Smart Tee (CLSID_SmartTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
    pSmartTee);

// Smart Tee (video) to Avi Mux.
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);

// Smart Tee to preview.
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);

// DV Splitter (audio) to Infinite Tee to Avi Mux.
IBaseFilter *pTee; // Create the Infinite Pin Tee (CLSID_InfTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);

// Infinite Pin Tee to preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);

È necessario creare i filtri Dv Splitter, DV Video Decoder, Smart Tee e Infinite Pin Tee e aggiungerli al grafico del filtro. Per brevità, questi passaggi vengono omessi dal codice precedente. Questo esempio usa il metodo ICaptureGraphBuilder2::FindPin per trovare i pin di acquisizione e anteprima nel filtro Smart Tee; l'acquisizione è sempre il pin di output 0 e l'anteprima è il pin di output 1.

Video digitale in DirectShow