Aprende a apilar fácilmente 2 videos de diferente resolución horizontalmente usando FFmpeg desde la línea de comando.

Apilar videos horizontalmente es fácil de acuerdo con la documentación de FFmpeg usando el filtro hstack. Este filtro te permite crear fácilmente un mosaico a partir de muchos videos siempre que tengan la misma resolución. Sin embargo, en la práctica, habrá casos en los que los videos no tendrán las mismas dimensiones. Para este artículo, trabajaremos con estos 2 videos grabados desde una transmisión de cámara web, uno de un maestro y el otro de un estudiante. Como ambos tienen diferentes cámaras que graban con diferente resolución, ambos videos tienen diferentes dimensiones:

Stack Videos Horizontally FFmpeg

La idea es colocarlos en un solo video apilado horizontalmente, mientras que el video final también conserva el audio de ambos. En este artículo, te explicaré cómo apilar 2 videos con diferente resolución horizontalmente usando FFmpeg.

A. Usando un filtro complejo 

La primera opción para apilar los videos horizontalmente será a través de un filtro complejo. El comando para llevar a cabo la tarea será el siguiente:

ffmpeg -i ./left-side-video.mp4 -i ./right-side-video.mp4 -filter_complex "<CUSTOM_FILTER_HERE>" -map "[a]" -ac 2 ./output-video.mp4

El comando recibirá los 2 videos como entrada y usará un filtro complejo que necesita ser reemplazado. El filtro personalizado será:

[0][1]scale2ref='oh*mdar':'if(lt(main_h,ih),ih,main_h)'[0s][1s];
[1s][0s]scale2ref='oh*mdar':'if(lt(main_h,ih),ih,main_h)'[1s][0s];
[0:a][1:a]amerge=inputs=2[a];
[0s][1s]hstack,setsar=1

El filtro se puede descomponer de esta manera. El método scale2ref escala o cambia el tamaño del video de entrada en función de un video de referencia. scale2ref admite lo mismo pero usa el video de referencia en lugar de la entrada principal como base. scale2ref también admite las siguientes constantes adicionales para las opciones 'w' y 'h':

  • main_w (ancho)
  • main_h (altura)

Para la relación de aspecto de muestra del video de entrada principal:

  • main_dar
  • mdar

La segunda secuencia de video se escalará para que coincida con el video principal. El comando completo para apilar ambos videos usando el filtro es:

ffmpeg -i ./left-video.mp4 -i ./right-video.mp4 -filter_complex "[0][1]scale2ref='oh*mdar':'if(lt(main_h,ih),ih,main_h)'[0s][1s]; [1s][0s]scale2ref='oh*mdar':'if(lt(main_h,ih),ih,main_h)'[1s][0s];[0:a][1:a]amerge=inputs=2[a]; [0s][1s]hstack,setsar=1" -map "[a]" -ac 2 ./output-video.mp4

El video de salida en este caso tendrá el siguiente diseño:

Stack Videos Horizontally FFmpeg Output

El lienzo es bastante grande como puede ver, con una resolución de casi 4K, solo para preservar la relación de aspecto.

B. Cambiar el tamaño de los videos antes de apilarlos

La otra opción no es para todos, sin embargo, también es útil bajo ciertas condiciones. FFmpeg ofrece el filtro hstack para apilar horizontalmente los videos, el único requisito es que ambos videos deben tener las mismas dimensiones (alto y ancho). Entonces, teniendo en cuenta que puede tener un tamaño fijo para los videos, procederemos con la siguiente tarea que redimensionará ambos videos a un tamaño común. Para mantener la relación de aspecto de los videos y la misma dimensión para ambos videos, los siguientes comandos harán el trabajo:

# Cambiar el tamaño del video del lado izquierdo
ffmpeg -n -i ./left-video.mp4 -vf "scale=w=960:h=540:force_original_aspect_ratio=1,pad=960:540:(ow-iw)/2:(oh-ih)/2" -c:v libx264 ./left-video_resized.mp4

# Cambiar el tamaño del video del lado derecho
ffmpeg -n -i ./right-video.mp4 -vf "scale=w=960:h=540:force_original_aspect_ratio=1,pad=960:540:(ow-iw)/2:(oh-ih)/2" -c:v libx264 ./right-video_resized.mp4

El comando básicamente cambiará el tamaño del video de entrada a una resolución de 960 * 540 mientras se mantiene la relación de aspecto. El área que entre en conflicto con la relación de aspecto se oscurecerá. Recuerde que el filtrado y la copia de flujo no se pueden usar juntos, por lo que deberá especificar el códec del video, en nuestro caso lo usaremos libx264. Después de cambiar el tamaño de ambos videos, tendrás 2 videos nuevos que se usarán en un nuevo comando que los apilará horizontalmente:

ffmpeg -n -i ./left-video_resized.mp4 -i ./right-video_resized.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]; [0:a][1:a]amerge[a]" -map "[v]" -map "[a]" -ac 2 ./output-video.mp4

El comando generaría un nuevo video con un ancho máximo de 1920 por 540:

Horizontally Stacked Video FFmpeg

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores