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).
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...:
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:
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:
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:
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:
Cuando conectamos ambos filtros, vemos que DirectShow ha añadido automáticamente nuevos filtros entre ellos:
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:
- Programming Microsoft DirectShow (Multimedia Programming)
- Programming Microsoft© DirectShow© for Digital Video and Television (Developer Reference)
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.