Capturar DV en RGB sin comprimir
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
En este ejemplo se muestra cómo capturar DV desde la videocámara y guardarlo en un archivo como RGB sin comprimir durante la vista previa. Use el gráfico de filtros que se muestra en el diagrama siguiente.
El filtro DIVISOR DV divide el audio/vídeo intercalado en secuencias de vídeo y audio independientes El vídeo codificado en DV va al filtro Descodificador de vídeo DV, que genera vídeo RGB sin comprimir. El vídeo RGB se enruta a través del filtro Smart Tee al filtro Mux avi (para la captura) y el representador de vídeo (para la vista previa). Mientras tanto, la secuencia de audio del divisor DV pasa por el filtro Infinite Pin Tee a avi Mux y al representador de audio. El Administrador de gráficos de filtros mantiene sincronizadas todas estas secuencias, utilizando las marcas de tiempo en los ejemplos y el reloj de referencia del grafo.
Este grafo podría parecer innecesariamente complicado, pero garantiza que la secuencia de vídeo codificada en DV solo se descodifique una vez, lo que minimiza los requisitos de CPU. Además, tenga en cuenta que el vídeo pasa por el filtro Smart Tee mientras el audio pasa por el filtro Infinite Pin Tee. Smart Tee puede quitar fotogramas de vista previa para mejorar el rendimiento de la captura, que es deseable para el vídeo, pero no para el audio, donde las muestras eliminadas son muy notables. Además, dado que el audio requiere un ancho de banda mucho menor que el vídeo, hay relativamente poca probabilidad de quitar audio en el archivo.
Debe compilar este grafo una sección a la vez, pero el método RenderStream puede seguir siendo útil. Use el código siguiente:
// 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);
Debe crear los filtros DV Splitter, DV Video Decoder, Smart Tee y Infinite Pin Tee, y agregar cada uno al gráfico de filtros. (Para mayor brevedad, estos pasos se omiten en el código anterior). En este ejemplo se usa el método ICaptureGraphBuilder2::FindPin para buscar los pins de captura y vista previa en el filtro Smart Tee; capture siempre es el pin de salida 0 y la vista previa es el pin de salida 1.
Temas relacionados