Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continua navegando, consideramos que acepta su uso. Puede cambiar la configuración u obtener más información aquí

View site in english Ir a la página de inicio Contacta conmigo
sábado, 30 de abril de 2016

Captura y reproducción de video con DirectShow. Conceptos básicos

Actualmente existen infinidad de dispositivos de captura de vídeo asequibles en el mercado, cualquiera puede hacerse con una cámara digital o una webcam a un precio razonable. Todos estos dispositivos se pueden controlar fácilmente desde un programa desarrollado por nosotros mismos utilizando DirectShow de Microsoft. DirectShow es un conjunto de interfaces que proporcionan un API genérico con el que se puede capturar y reproducir audio y vídeo sin importar la marca o modelo de cámara que utilicemos. También permite la grabación y reproducción de archivos en cualquier formato.

Los archivos de audio y vídeo se almacenan en formatos comprimidos. Para poder grabarlos y reproducirlos, es necesario contar con un códec apropiado. En este enlace podéis descargar VCL Codec Pack, que es un conjunto de códecs gratuito que proporciona soporte para muchos de estos formatos.

En este artículo, vamos a ver los componentes básicos de DirectShow utilizando una herramienta llamada GraphEdit incluida en DirectX SDK. Una vez instalado, la podéis encontrar en el directorio C:\Program Files (x86)\Windows Kits\8.1\bin\x86\graphedt.exe (8.1 es la versión, puede que en vuestro caso el número sea diferente, x86 es el directorio para sistemas de 32 bits, en sistemas de 64 bits utilizaremos la versión incluida en el directorio x64).

Herramienta Graph Edit
Aplicación Graph Edit

Los elementos básicos del sistema son los filtros. Cada uno de estos elementos se encarga de una determinada tarea en el proceso de la codificación y decodificación de la información procedente del dispositivo. Existen filtros para leer dispositivos de captura de vídeo, leer o escribir archivos de vídeo en distintos formatos, compresores, tratamiento del color y un largo etcétera.

Cada filtro dispone de diferentes puntos de entrada y salida llamados pines, que permiten conectar entre sí los diferentes componentes en una cadena de operaciones llamada grafo de filtros. Por ejemplo, un filtro de captura de vídeo puede tener un pin de salida para el canal de vídeo y otro para el canal de audio, con los cuales podemos enlazarlo a un filtro compresor y este a su vez con otro filtro que escriba los datos comprimidos en un fichero.

Para construir un grafo de filtros, utilizaremos la opción de menú Graph / Insert Filters...:

Cuadro de diálogo para seleccionar filtros
Cuadro de diálogo de selección de filtros

Aquí buscaremos en la categoría Video Capture Sources, donde deberían aparecer listados los dispositivos de captura instalados en el sistema. En mi caso voy a seleccionar la webcam Logitech C510. Con el botón Insert Filter veremos que se crea el primer elemento del grafo:

Selección del filtro dispositivo de entrada de la webcam
Selección del filtro dispositivo de entrada de la webcam

A la derecha podemos observar dos pines de salida, uno para capturar vídeo y otro para capturar una instantánea. Ahora vamos a añadir otro filtro para reproducir el vídeo procedente de la cámara. Buscaremos en la sección DirectShow filters un dispositivo llamado Video Renderer, y volveremos a pulsar el botón Insert Filter:

Filtro final Video Renderer
Selección del filtro de punto final Video Renderer

Ahora solo tenemos que conectar la salida de la cámara con la entrada del reproductor, para ello, pulsaremos sobre el pin correspondiente y arrastraremos con el ratón hasta el pin con el que queremos conectarlo:

Conexión del grafo de filtros usando los pines
Grafo de filtros conectado

Y eso es todo, sencillo ¿no?, ahora solo tenemos que pulsar el botón de reproducción y podremos ver la imagen procedente de la webcam. Vamos a ver ahora un ejemplo más complejo con el que os mostraré una de las características más importantes y útiles de DirectShow. Vamos a crear un grafo para reproducir un archivo de vídeo MP4. En primer lugar, dentro de la sección DirectShow Filters, seleccionaremos el filtro File Source (Async.), que nos pedirá que seleccionemos un archivo de vídeo, y seleccionaremos como antes el filtro Video Renderer para reproducirlo:

Creación de un grafo de filtros para reproducir archivos de vídeo
Creación de un grafo para rfeproducir archivos de vídeo

Cuando conectamos ambos filtros, vemos que DirectShow ha añadido automáticamente nuevos filtros entre ellos:

Filtros intermedios seleccionados automáticamente por DirectShow
DirectShow selecciona los filtros intermedios apropiados por tí

El filtro LAV Spliter separa el canal de vídeo y el canal de audio, mientras que MPEG Video Decoder decodifica los datos en formato MPEG para que el Video Renderer pueda reproducir la película. ¡DirectShow ha seleccionado automáticamente todos los elementos intermedios necesarios para la correcta reproducción! Esto facilita mucho la tarea a la hora de realizar un programa de captura y reproducción de vídeo, ya que solo tenemos que preocuparnos del filtro inicial y final del grafo, y el sistema hará todo el trabajo difícil por nosotros.

Pero DirectShow tiene muchas características adicionales, como la posibilidad de negociar diferentes formatos de vídeo o el tamaño de los frames entre los pines de entrada y salida. Aquí os dejo enlaces a un par de libros sobre la programación con DirectShow donde podréis encontrar todo lo necesario para convertiros en unos expertos del tema:

En el próximo artículo veremos cómo implementar todo esto en un programa desarrollado por nosotros mismos, con una aplicación de ejemplo que podéis utilizar como punto de partida para las vuestras.

Comparte este artículo: Compartir en Twitter Compártelo en Facebook Compartir en Google Plus Compartir en LinkedIn
Comentarios (0):
* (Su comentario será publicado después de la revisión)

E-Mail


Nombre


Web


Mensaje


CAPTCHA
Change the CAPTCHA codeSpeak the CAPTCHA code