Combinación de captura de vídeo y vista previa
[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 las secciones anteriores se describe cómo capturar vídeo en varios formatos de archivo. En la sección Previewing Video se describe cómo crear un gráfico de vista previa en directo. Sin embargo, muchas aplicaciones deben hacer ambas a la vez. Para crear un gráfico combinado de vista previa y escritura de archivos, basta con realizar dos llamadas 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);
En este código, Capture Graph Builder oculta algunos detalles:
Si el filtro de captura tiene un pin de vista previa o un pin de puerto de vídeo, además de un pin de captura, el método RenderStream simplemente representa ambos pines, como se muestra en la ilustración siguiente.
Si el filtro solo tiene un pin de captura, Capture Graph Builder usa el filtro Smart Tee para dividir la secuencia de captura. En la ilustración siguiente se muestra el gráfico con un smart Tee.
El filtro Smart Tee tiene un pin de captura y un pin de vista previa. Toma una sola secuencia de vídeo del filtro de captura y la divide en dos secuencias, una para la captura y otra para la versión preliminar. Para mantener el rendimiento en el pin de captura, el pin de vista previa quita fotogramas según sea necesario. También quita las marcas de tiempo de cada ejemplo antes de entregarla, por los motivos descritos en el tema DirectShow Video Capture Filters.
Aunque smart Tee divide la secuencia, no duplica físicamente los datos de vídeo. En su lugar, usa objetos de ejemplo multimedia personalizados que comparten los búferes. Los ejemplos se marcan como "de solo lectura" para asegurarse de que los filtros de bajada no escriben en los datos.
Si el grafo de captura tiene una ventana de vista previa, puede hacer que el Administrador de gráficos de filtros detenga todo el grafo, incluido el flujo de captura:
- Bloquear el equipo.
- Presione CTRL+ALT+DELETE en un equipo que sea miembro de un dominio.
- Ejecutar una aplicación direct3D de pantalla completa, como un juego o un protector de pantalla.
- Cambiar monitores o cambiar la resolución de pantalla.
- Ejecutar un programa que hace que Windows muestre un cuadro de diálogo Control de cuentas de usuario (UAC). (Windows Vista o posterior).
- Ejecución de una ventana DOS de pantalla completa.
Cualquiera de estos eventos podría interrumpir la sesión de captura, lo que podría provocar la pérdida de datos. (Esto es lo que sucede internamente: el representador de vídeo pierde los recursos de Direct3D o DirectDraw que necesita. En el proceso de recuperación de esos recursos, el representador de vídeo debe volver a conectarse con el filtro ascendente, lo que hace que el Administrador de gráficos de filtros detenga el grafo).
Dos posibles soluciones a este problema son las siguientes:
- No incluya una secuencia de vista previa. Sin embargo, tenga en cuenta que el método ICaptureGraphBuilder2::RenderStream agrega automáticamente una ventana de vista previa cuando el dispositivo de captura tiene un pin de puerto de vídeo. Consulte Clavijas de puerto de vídeo en la captura de archivos.
- Use el motor de búfer de flujo para enviar la secuencia de vista previa a un grafo en otro proceso.
Temas relacionados