Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEnginey captura de audio y 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 captura de audio y vídeo 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 mientras se obtiene una vista previa. Use el gráfico de filtros que se muestra en el diagrama siguiente.
El filtro DV Splitter divide el audio/vídeo intercalado en secuencias de vídeo y audio independientes El vídeo codificado en DV va al dv video descodificador filtro, 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 el representador de audio. El Administrador de gráficos de filtros mantiene sincronizadas todas estas secuencias, usando las marcas de tiempo en los ejemplos y el reloj de referencia del grafo.
Este gráfico puede 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, lo 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 posibilidad de quitar audio en el archivo.
Debe compilar este grafo una sección a la vez, pero el método RenderStream todavía puede ayudar. 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 del código anterior). En este ejemplo se usa el método ICaptureGraphBuilder2::FindPin para buscar las patillas 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