Compartir a través de


Funcionalidades de vídeo

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

El método IAMStreamConfig::GetStreamCaps presenta funcionalidades de vídeo en una matriz de pares de AM_MEDIA_TYPE y estructuras VIDEO_STREAM_CONFIG_CAPS . Puede usarlo para exponer todos los formatos y resoluciones admitidos en un pin, como se describe a continuación.

Para obtener ejemplos relacionados con audio de GetStreamCaps, consulte Funcionalidades de audio.

Supongamos que la tarjeta de captura admite el formato JPEG en todas las resoluciones entre 160 x 120 píxeles y 320 x 240 píxeles, ambos incluidos. La diferencia entre las resoluciones admitidas es una en este caso porque agrega o resta un píxel de cada resolución admitida para obtener la siguiente resolución admitida. Esta diferencia en las resoluciones admitidas se denomina granularidad.

Supongamos que la tarjeta también admite el tamaño 640 x 480. A continuación se muestra esta resolución única y el intervalo de resoluciones anterior (todos los tamaños entre 160 x 120 píxeles y 320 x 240 píxeles).

resolución de 160 x 120 a 320 x 240 píxeles, más 640 x 480

Además, supongamos que admite formato RGB de color de 24 bits en resoluciones entre 160 x 120 y 320 x 240, pero con una granularidad de 8. En la ilustración siguiente se muestran algunos de los tamaños válidos en este caso.

resolución de 160 x 120 a 320 a 240, con granularidad = 8

Para ponerla de otra manera, y enumerar más resoluciones, las siguientes se encuentran entre la lista de resoluciones válidas.

  • 160 x 120
  • 168 x 120
  • 168 x 128
  • 176 x 128
  • 176 x 136
  • ... resoluciones adicionales...
  • 312 x 232
  • 320 x 240

Use GetStreamCaps para exponer estas funcionalidades de formato de color y dimensión al ofrecer un tipo de medio de 320 x 240 JPEG (si es su tamaño predeterminado o preferido) junto con capacidades mínimas de 160 x 120, capacidades máximas de 320 x 240 y una granularidad de 1. El siguiente par que expone mediante GetStreamCaps es un tipo de medio de 640 x 480 JPEG junto con un mínimo de 640 x 480 y un máximo de 640 x 480 y una granularidad de 0. El tercer par incluye un tipo de medio de 320 x 240, RGB de 24 bits con capacidades mínimas de 160 x 120, capacidades máximas de 320 x 240 y una granularidad de 8. De esta manera, puede publicar casi todos los formatos y funcionalidades que la tarjeta puede admitir. Una aplicación que debe saber qué formatos de compresión proporciona puede obtener todos los pares y crear una lista de todos los subtipos únicos de los tipos de medios.

Un filtro obtiene sus rectángulos de origen de tipo multimedia y de destino de los miembros rcSource y rcTarget de la estructura VIDEOINFOHEADER, respectivamente. Los filtros no tienen que admitir rectángulos de origen y de destino.

El rectángulo de recorte descrito en toda la documentación de IAMStreamConfig es el mismo que el rectángulo rcSource de la estructura VIDEOINFOHEADER para el pin de salida.

El rectángulo de salida descrito a lo largo de la documentación de IAMStreamConfig es el mismo que los miembros biWidth y biHeight de la estructura BITMAPINFOHEADER del pin de salida (vea Datos DV en el formato de archivo AVI).

Si el pin de salida de un filtro está conectado a un tipo de medio con rectángulos de origen y destino no vacíos, el filtro es necesario para ajustar el subrectangle de origen del formato de entrada en el subrectangle de destino del formato de salida. El subrectangle de origen se almacena en el miembro InputSize de la estructura VIDEO_STREAM_CONFIG_CAPS.

Por ejemplo, considere el siguiente escenario de compresor de vídeo: la imagen de entrada está en formato RGB y tiene un tamaño de 160 x 120 píxeles. La esquina superior izquierda del rectángulo de origen está en coordenadas (20,20) y su esquina inferior derecha está en (30,30). La imagen de salida está en formato MPEG con un tamaño de 320 x 240. La esquina superior izquierda del rectángulo de destino está en (0,0) y su esquina inferior derecha está en (100,100). En este caso, el filtro debe tomar una parte de 10 x 10 del mapa de bits de origen RGB de 160 x 120 y hacer que rellene el área superior de 100 x 100 de un mapa de bits de 320 x 240, dejando el resto del mapa de bits 320 x 240 intacto. En la ilustración siguiente se muestra este escenario.

extensión de subrectangle

Es posible que un filtro no admita esto y no pueda conectarse con un tipo de medio donde rcSource y rcTarget no estén vacíos.

La estructura VIDEOINFOHEADER expone información sobre las funcionalidades de velocidad de datos de un filtro. Por ejemplo, supongamos que ha conectado el pin de salida al siguiente filtro con un tipo de medio determinado (ya sea directamente o mediante el tipo de medio pasado por la función CMediaType::SetFormat ). Examine el miembro dwBitRate de la estructura de formato VIDEOINFOHEADER de ese tipo de medio para ver a qué velocidad de datos debe comprimir el vídeo. Si multiplica el número de unidades de tiempo por fotograma en el miembro AvgTimePerFrame de la estructura VIDEOINFOHEADER por la velocidad de datos del miembro dwBitRate y divide en 10 000 000 (el número de unidades por segundo), puede averiguar cuántos bytes debe tener cada fotograma. Puede producir un marco de tamaño más pequeño, pero nunca uno más grande. Para determinar la velocidad de fotogramas de un compresor de vídeo o para un filtro de captura, use AvgTimePerFrame desde el tipo de medio del pin de salida.