Unir multiples vídeos a la vez con FFmpeg y bash

2
16676

Este pequeño tutorial nos servirá para mostrar las bondades de la herramienta multiplataforma FFmpeg para la edición de vídeo así como el uso de la programación bash para hacer pequeños scripts.

Índice de contenidos

1. Introducción. ¿Qué te hace querer unir varios videos a la vez?

Me surgió esta necesidad por querer añadir un opening o cabecera a varios vídeos que ya se habían realizado. Por tanto era necesario ir vídeo por vídeo añadiendo la cabecera. Quería algo que lo añadiese a todos los vídeos a la vez y así no perder el tiempo.

Descubrí FFmpeg, una herramienta que se usa por terminal y permite hacer todo tipo de operaciones con vídeos: recortes, conversiones, filtros, transcodificaciones, etc. El hecho de que se use por terminal facilita que se pueda hacer un sencillo script bash para que se aplique a todos los vídeos. Más adelante veremos cómo.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: 2 Ghz Intel Core I7, 8GB DDR3
  • Sistema Operativo: OS X El Capitan
  • Entorno de desarrollo: Atom
  • Entorno de desarrollo: Eclipse Mars

3. Instalación

La herramienta FFmpeg es multiplataforma, es posible instalarla tanto en mac, como en linux o windows. Descargamos la versión para nuestra plataforma y a trabajar!

4. Uniendo vídeos

A la hora de unir varios vídeos, es importante hacer una distinción: si tienen o no el mismo códec. Empezaremos con la forma general, por si tienen códecs distintos.

En primer lugar vamos a ver la orden aplicada a dos vídeos (aunque uno lo vamos a concatenar al principio y al final, o sea que tendremos 3 entradas), y luego vemos cómo podemos automatizarla para varios vídeos.

ffmpeg -i opening.mp4 -i video2.webm opening.mp4 \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]"  salida.mp4

Empezamos seleccionando los vídeos fuente, los que queremos unir, con el argumento -i. Después observamos el argumento -filter_complex al que enviamos lo que se va a enviar al filtro de concatenado (señalar que lo que se envía al filtro ha de estar entre comillas).

La parte [0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] indica que la pista de video 0 (v:0) y de audio (a:0) del vídeo 0 (el primero que hemos pasado), siguiendo con el vídeo 1, y luego el 2, es decir, se van a concatenar audio y vídeo en ese orden, los tres videos en orden.

La pista de video 0 significa que es la primera pista de video que tenga el video (puede tener varias), lo mismo pasa con el audio 0 (hay videos con varias pistas, normalmente para cambiar de idioma).

Siguiendo en esa línea, concat=n=3:v=1:a=1 [v] [a], el n=3 significa que le estamos pasando 3 videos, y el v=1 y a=1 indican que al final vamos a tener una sola pista de audio y de video. La [v] y la [a] finales son nombres que se le dan a esas pistas de audio y video que generamos para referirnos a ellas posteriormente.

Finalmente -map “[v]” -map “[a]” le dice a ffmpeg que use las pistas de audio y video que acabamos de unir en vez de las originales para generar la salida.mp4. La orden funcionaría así perfectamente, sin embargo, usuarios avanzados pueden necesitar especificar unas opciones específicas de encoding para el vídeo de salida.

Llegados a este punto hemos unido varios vídeos en uno. ¿Cómo podemos automatizar esto para que se aplique a muchos vídeos? La respuesta es programación bash. Haremos un pequeño script que se aplique a todos los vídeos de nuestro directorio. Vamos a ver cómo se hace.

4.1 Generando nuestro script

Necesitamos aplicar el script a los videos de nuestro directorio. Supongamos que están en mp4. Usaremos un bucle for que recorra todos los archivos usando una expresión regular que corresponda al nombre de los videos, como puede ser *.mp4 (todos los archivos .mp4).

#/bin/bash

OPENING=opening.mp4

for video in [!o]*.mp4
do

ffmpeg -i $OPENING -i $video $OPENING \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" "$video"_conCabeceras.mp4

done;

Como vemos arriba, el bucle recorre la lista de archivos que mp4 que no empiezan por «o» (ya que queremos usar el archivo opening.mp4 como cabecera y final de los vídeos. Esto es totalmente personalizable, por supuesto.

En el cuerpo del bucle usamos la orden que hemos detallado antes, adaptando los nombres.

4.2. Mismos códecs

Recordamos que si los videos que queremos unir tienen el mismo códec, la orden ffmpeg era algo más simple:

ffmpeg -f concat -i listaDeVideos.txt -c copy salida

Como vemos, la orden es mucho más sencilla, lo único que hay que pasar una lista de los vídeos que queremos unir, dando sus rutas absolutas.

5. Otras posibilidades

Lo que hemos visto ahora es sólo una de las muchas posibilidades que ofrece la herramienta FFmpeg. Despediremos el tutorial con un ejemplo de cómo eliminar los primeros 15 segundos de los vídeos mp4 del directorio.

#/bin/bash

for file in *.mp4
do

ffmpeg -i $file --ss 00:00:15 “$file”_recortado.mp4

done

6. Conclusiones

Como hemos visto es bastante sencillo. No salen apenas líneas para este tipo de operaciones. Únicamente hay que investigar qué se puede hacer con ffmpeg y una programación bash básica.

7. Referencias

2 COMENTARIOS

  1. Adrián de antemano muchas gracias por este tutorial pues la forma como explicas es muy entendible para personas como nosotros que iniciamos en el tema de ffmpeg.
    Adrián me gustaría que me aconsejaras pues estoy creando un proyecto que se relaciona con la grabación de vídeo con ffmpeg pero tengo un problema que es el siguiente, quiero crear un buffer tipo FIFO donde yo le especifique cuanto de vídeo obtenido se va a estar almacenando y asi cuando quiera una repetición instantánea de ese video lo saco del buffer tipo FIFO, e colsultado mucho y dicen que con ffmpeg no se puede hacer eso pero tampoco dicen con que herramienta puedo crear esto por eso acudo a solicitar tu consejo.
    Te agradezco mucho tu ayuda y ojala me pueda aconsejar

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad