Concatenar videos juntos usando ffmpeg!

Me ha resultado muy útil concatenar varios archivos de vídeo juntos después de trabajar en ellos por separado. Resulta que eso es bastante sencillo de hacer con ffmpeg.

Cómo hacemos esto?

Hay tres métodos que he encontrado hasta ahora:

  • Usando el enfoque de demuxer concat
    • Este método es muy rápido ya que evita la transcodificación.
    • Este método solo funciona si los archivos tienen la misma codificación de video y audio; de lo contrario, se introducirán artefactos
  • Usando el enfoque de concatenación a nivel de archivo
    • Hay algunas codificaciones que admiten la concatenación de nivel de archivo, algo así como usar cat en dos archivos en la terminal
    • Hay muy pocas codificaciones que pueden hacer esto, la única que he usado es el códec MPEG-2 Transport Stream (.ts)
  • Usar un gráfico de filtro complejo con el filtro concat
    • Este método puede concatizar videos con diferentes codificaciones.
    • Esto hará que se produzca una transcodificación, por lo que lleva tiempo y puede degradar la calidad.
    • La sintaxis es difícil de entender si nunca antes ha escrito gráficos de filtro complejos para ffmpeg

Veamos los ejemplos, primero el enfoque de demuxer concat:

ffmpeg -f concat -i list.txt -c copy out.mp4

Entrar en el modo de pantalla completa Salir del modo de pantalla completa

A diferencia de la mayoría de los comandos ffmpeg, este toma un archivo de texto que contiene los archivos que queremos concatenar, el archivo de texto se vería así:

file 'video1.mp4'
file 'video2.mp4'

Entrar en el modo de pantalla completa Salir del modo de pantalla completa

El ejemplo de la concatenación a nivel de archivo se vería así:

ffmpeg -i "concat:video1.ts|video2.ts" -c copy out.ts

Entrar en el modo de pantalla completa Salir del modo de pantalla completa

y el último ejemplo sería así:

ffmpeg -i video1.mp4 -i video2.flv -filter_complex 
"[0:v][0:a][1:v][1:a] concat=n=2:v=1:a=1 [outv] [outa]" 
-map "[outv]" -map "[outa]" out.mp4

Entrar en el modo de pantalla completa Salir del modo de pantalla completa

Este es probablemente bastante confuso, así que déjame explicarte la compleja sintaxis del gráfico de filtro:

A diferencia de usar filtros normalmente con ffmpeg usando -vf o -af, cuando usamos un gráfico de filtro complejo, tenemos que decirle a ffmpeg en qué flujos de datos estamos operando por filtro.

Al principio ves:

[0:v][0:a][1:v][1:a]

Esto se traduce en inglés simple a:

Use el flujo de video de la primera fuente de entrada, use el flujo de audio de la primera fuente de entrada, use el flujo de video de la segunda fuente de entrada y use el flujo de audio de la segunda fuente de entrada.

La sintaxis de corchetes indica:

[index_of_input:stream_type]

Aquellos de nosotros con experiencia en programación entenderemos por qué el índice comienza en 0 y no en 1

Ahora, después de declarar qué flujos estamos usando, tenemos una sintaxis de filtro normal:

concat = n = 2: v = 1: a = 1

concat es el nombre del filtro

n=2 especifica que hay dos fuentes de entrada

v=1 indica que cada fuente de entrada tiene solo una transmisión de video y para escribir solo una transmisión de video como salida

a=1 indica que cada fuente de entrada tiene solo un flujo de audio y para escribir solo un flujo de audio como salida

A continuación, etiquetamos los flujos de datos creados por el filtro usando la sintaxis de corchetes:

[outv] [outa]

Aquí, llamamos a la secuencia de video recién creada outv y la secuencia de audio outa, los necesitaremos más adelante cuando usemos el -map bandera en la salida

Por último, necesitamos decirle explícitamente a ffmpeg qué flujos de datos asignar a la salida que se escribe en el archivo, usando el -map opción

-mapa «[outv]» -mapa «[outa]»

¿Que los nombres te resultan familiares? Es lo que etiquetamos las corrientes creadas a partir del filtro concat. Le estamos diciendo a ffmpeg:

No use las transmisiones directamente desde los archivos de entrada, en su lugar use estas transmisiones de datos creadas por un gráfico de filtro.

Y con eso, déjalo correr y tada, has concatenado dos videos con codificaciones completamente diferentes, ¡hurra!

Deja una respuesta 0

Your email address will not be published. Required fields are marked *