lunes, 8 de junio de 2020

Captura y Codificación de Vídeo Analógico con FFmpeg

Con una capturadora de vídeo con entrada para vídeo compuesto o S-Video podemos pasar al ordenador a formato digital los vídeos grabados en múltiples formatos analógicos como VHS, Video8 o Hi8. Los vídeos analógicos tienen un formato físico y sobre este medio físico se codifican la imagen y el audio en diferentes formatos. De forma similar hay múltiples sistemas digitales y se componen de básicamente tres partes de las que se pueden hacer diferentes combinaciones: contenedor, codificación de vídeo y codificación de audio.

En Linux u otros sistemas operativos podemos usar FFmpeg para capturar el vídeo y codificarlo en múltiples formatos como MPEG2 o H.264 / MP4. La codificación se hace en tiempo real, a la misma velocidad que la reproduciendo del vídeo. Esto hace que para codificar a H.264 necesitemos un procesador bastante potente y/o con codificación H.264 integrada. MPEG2 requiere menos capacidad de proceso pero el archivo resultante ocupa más espacio. H.264 se puede configurar para que utilice menos procesador a cambio de que el archivo resultante sea más grande acercándose bastante al resultado de MPEG2.

# ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1,0 -vf crop=690:560:10:10 -af "volume=7" -target pal-dvd video.mpg

# ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1,0 -vf crop=690:560:10:10 -af "volume=7" -preset medium video.mp4

Al comando ffmpeg se le pasan los siguientes parámetros:

  • Sistema de vídeo Video4Linux: -f v4l2
  • Sistema de audio ALSA: -f alsa
  • Dispositivo de entrada de vídeo: -i /dev/video0
  • Dispositivo de entrada de audio: -i hw:1,0
  • Filtro de vídeo para ajustar la captura a los bordes de la imagen: -vf crop=690:560:10:10.
  • Filtro de audio para ajustar el volumen: -af "volume=7"
  • Codificación de vídeo MPEG2 con las mismas características que un DVD: -target pal-dvd o ntsc-dvd
  • Nivel de compresión de H.264: -preset ultrafast, superfast, veryfast, faster, fast, medium, slow, slower o veryslow

Para codificar a MP4 es suficiente con que el archivo en el que se graba tenga la extensión .MP4. FFmpeg utilizará el contenedor MP4, codificará el vídeo con H.264 y el audio con AAC.

Para codificar a MPEG2 no es suficiente con la extensión porque al utilizar la extensión .MPG codifica a MPEG1. Con -target pal-dvd o ntsc-dvd, dependiendo de si el formato de la videocámara es PAL o NTSC, se crea un archivo MPEG2 con las mismas características que el vídeo de un DVD y podrá ser reproducido en casi cualquier aparato: reproductores de DVD, televisores, ordenadores, tablets o móviles.

A continuación se muestra la salida de ffmpeg con -target pal-dvd y como codifica el vídeo con MPEG2 Vídeo y el audio con AC-3. Para el vídeo utiliza una resolución de 720x576 puntos, una tasa de bits variable con una media de 6000 kb/s y 25 fotogramas por segundo. Para el audio también fija las características necesarias para el formato usado en los DVD.

Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Video: mpeg2video (Main), yuv420p(progressive), 720x576, q=2-31, 6000 kb/s, 25 fps, 90k tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.35.100 mpeg2video
    Side data:
      cpb: bitrate max/min/avg: 9000000/0/6000000 buffer size: 1835008 vbv_delay: -1
    Stream #0:1: Audio: ac3, 48000 Hz, stereo, fltp, 448 kb/s
    Metadata:
      encoder         : Lavc58.35.100 ac3

Para la grabación a MP4 con codificación de vídeo H.264 existe el parámetro -preset, de forma similar a -target nos da una serie de grupos de parámetros predefinidos para hacer la compresión con menos o más uso de procesador y más o menos tamaño de archivo. Cuanto más rápido (fast) la compresión necesitará menos uso de procesador pero el archivo resultante será más grande y cuanto más lento (slow) la compresión necesitará más uso de procesador y el archivo resultante será más pequeño. Por defecto se usa medium.

También se pueden especificar las características del vídeo MPEG2 o MP4 de forma manual o crear otro tipo de archivo eligiendo el contenedor, codificación de vídeo y codificación de audio así como las características de cada uno de estos componentes.

Si queremos editar el vídeo y tenemos suficiente espacio en el disco duro podemos utilizar el formato DV (Digital Video), un formato digital con poca compresión usado por algunas videocámaras. Al comando ffmpeg le debemos pasar el parámetro -target pal-dv o ntsc-dv.

# ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1,0 -vf crop=690:560:10:10 -af "volume=7" -target pal-dv video.dv

Una vez editado o si el archivo procede de una cámara lo podemos convertir a MPEG2 o MP4 utilizando los mismos parámetros que en la captura con la diferencia de que la entrada indicada con el parámetro -i es el archivo y ya no es necesario hacer ajustes en el vídeo y el audio.

# ffmpeg -i video.dv -target pal-dvd video.mpg

# ffmpeg -i video.dv -preset medium video.mp4

Al capturar vídeo analógico los bordes de la imagen del vídeo no coinciden exactamente con los bordes de la imagen que proporciona la capturadora, alrededor de la imagen del vídeo quedan franjas en negro o con ruido. Además puede haber diferencias entre unos vídeos y otros. Con el filtro de vídeo crop podemos recortar la imagen de la capturadora y hacer que solo se capture la imagen del vídeo. Este filtro se compone de cuatro valores separados por dos puntos: ancho, alto, inicio del ancho e inicio del alto. Las coordenadas 0:0 se encuentran en la esquina superior izquierda. En los comandos de ejemplo la capturadora proporciona una imagen de 720x576 puntos y se captura una imagen de 690x560 puntos que empieza a los 10 puntos de ancho y 10 puntos de alto. A continuación se muestran dos imágenes de ejemplo, la primera sin recortar los bordes y la segunda con los bordes recortados.


Para poder ver el vídeo de la cámara antes de grabarlo y ajustar los bordes de la imagen y el volumen podemos pasar la salida de ffmpeg al reproductor ffplay.

# ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1,0 -vf crop=690:560:10:10 -af "volume=7" -target pal-dvd - | ffplay -

Una vez grabado el vídeo podemos hacer copias de algunos fragmentos usando también el comando ffmpeg. El parámetro -ss indica la posición inicial desde donde comienza la copia, -t el tiempo que dura el fragmento a copiar y -i el archivo de vídeo del que queremos hacer la copia. Con -acodec copy y -vcodec copy hacemos que el vídeo se copie tal cual, sin volver a codificarlo. Si queremos también podemos indicar que la copia se haga en otro formato pero debemos tener en cuenta que la recodificación a otro formato puede empeorar la calidad del vídeo y/o audio. Con vídeos MPEG2 es necesario el parámetro -target pal-dvd para que use un contenedor MPEG2 en lugar de MPEG1.

# ffmpeg -ss 00:30:00 -t 00:45:00 -i video.mpg -target pal-dvd -acodec copy -vcodec copy fragmento1.mpg

Estás son algunas de las cosas básicas que hay que saber para capturar y codificar vídeo con FFmpeg. Si necesitamos hacer algo más con el vídeo este software permite el uso de infinidad de parámetros que se pueden consultar en su documentación. Si tienes alguna duda puedes preguntarla en un comentario.

No hay comentarios:

Publicar un comentario