Comandos útiles de ffmpeg.
Redimensionamos un vídeo mediante filter_complex.
Empecemos por la base:
ffmpeg tiene una propiedad llamada filter_complex que se encarga de múltiples opciones entre ellas el reescalado de entrada.
La propiedad scale nos permite escalar un vídeo / imagen mediante:
scale=ancho:alto
.
Veamos algunos ejemplos extraídos de esta ilustrativa guía.
1.- Reescalar a proporciones fijas:
ffmpeg -i input.avi -vf scale=320:240 output.avi
2.- Reescalar en base solo al ancho, el alto se reajusta automáticamente manteniendo las proporciones:
ffmpeg -i input.jpg -vf scale=320:-1 output_320.png
Fíjate que el alto está establecido a -1
haciendo que se ajuste proporcionalmente en base al ancho.
3.- Reescalar en base a un tamaño dinámico:
ffmpeg -i input.jpg -vf scale=iw*2:ih input_double_width.png
En este ejemplo aumentamos el ancho del vídeo x2 dejando el alto intacto.
Usaremos una codificación de salida .mp4.
Con ffmpeg vamos a grabar el escritorio. Por defecto en distro como Ubuntu no diferencia entre diversos monitores si no que los suma en un sólo. Ejemplo: si tenemos un monitor de 1920x1080 y otros de 1280x1024 nos sumará para tener 3200 de ancho.
Sabiendo este dato vamos a ver varios ejemplos de uso.
El comando:
ffmpeg -framerate 25 -video_size 1920x1080 -f x11grab -draw_mouse 1 -show_region 1 -region_border 3 -i :0.0 -f alsa -ac 2 -i pulse -vcodec libx264 -crf 0 -preset medium -acodec libmp3lame output.mp4
-framerate: 25 equivale a los FPS que queremos que grabe a mayor cantidad más tamaño.
-video_size: es el tamaño del vídeo a grabar.
-f: fuerza el formato de entrada / salida. No es necesario en todos los casos porque ffmpeg puede detectar el tipo de entrada y la salida sugerida dependiendo de la extensión del fichero de entrada.
draw_mouse: 1 muestra ratón, 0 lo elimina. Default 1
follow_mouse: centered mantiene el ratón en el centro, (ojo que puede grabar por fuera de los márgenes que estableciste).
show_region: te muestra la region que se está grabando. Solamente la ve el espectador cuando ésta se mueve, mientras permanecerá oculta para ellos, no para ti
region_border: Va junto a show_region para mostrar el ancho del border. Número de 1 a 128, default 3.
alsa: en construcción.
-ac: indica el número de canales de audio. Para los formatos de salida, por defecto usa el mismo valor de los canales de entrada.
-i: es la pantalla desde la que se va a grabar. Si en consola pones echo $DISPLAY
verás cual es la tuya, por defecto 0.0 indica el monitor 1. Recueda que Ubuntu no nos
diferenciaba ;-).
-vcodec: el código de vídeo a utilizar. Usamos mp4, puede consultar los detalles aquí.
-crf: en construcción.
-preset: son los diferentes tipos de cofiguración, de más rápida y con más pérdida a más lenta y pesada pero con menos pérdida. Las opciones son: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo. Placebo no está recomendada ya que es más eficiente buscar otro formato sin pérdida a usar esta opción.
-acodec: alias de -codec:a el formato de audio. En este caso sería un wav sin pérdida de 16 bits.
En este caso debemos sumarle un offset de 1920 (ancho del monitor principal) además de cambiar el tamaño de grabación. Recuerda que usamos un monitor secundario con una resolución inferior al principal.
ffmpeg -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0+1920,0 -f alsa -ac 2 -i pulse -vcodec libx264 -crf 0 -preset medium -acodec libmp3lame output.mp4
Hemos seguido esta guía además de las opciones de la documentación oficial (al final de este gist) para realizar los ejemplos.
En este enlace encontrarás un listado de formatos de audio según calidad. El empleado en estos ejemplos (mp3) sería de calidad intermedia.
Puedes usar aac cambiando -acodec libmp3lame
por
-acodec aac -stritc -2
. El -strict -2 se usa debido a que
aac es una característica experimental en la fecha de redacción
de estos ejemplos.
¡Stackoverflow al rescate! Puedes ver varios ejemplos en las respuestas a esta pregunta.
Lo que necesitas es crop y puedes unir los vídeos en formatos verticales, horizontales o incluso diagonales. Disfruta creando ;-).
Crear múltiples overlays en un vídeo principal.
Aunque la lógica te podría impulsar a hacer algo como esto:
video = "video"
overlay1 = video + "foo"
overlay2 = video + "bar"
output = overlay1 + overlay2
Deberás hacer algo como esto para que te funcione:
video = "video"
overlay1 = video + "foo";
overlay2 = overlay1 + "bar"
output = overlay2;
Aquí te dejo el comando que sirve para realizar un overlay con 2 vídeos:
ffmpeg -i video_main.mp4 -filter_complex "movie=smaller_video1.mp4[thumb1]; movie=smaller_video2.mp4[thumb2]; [thumb1] overlay=W-w[step1]; [step1][thumb2] overlay=W-w:H-h" output-overlay.mp4
La base es la misma, agregar al overlay anterior el nuevo. Expliquemos el comando:
Haremos un ejemplo de reescalado de tres vídeos. La idea es mostrar un primer vídeo en la parte superior a modo de "vídeo destacado" y en la parte inferior otros dos vídeos extra.
Por simplicidad esta parte de la documentación ha sido movida a un ffmpeg-scale.md.
Para nuestro ejemplo de un vídeo destacado principal y otros dos "normales". En este simple esquema puedes ver el resultado que buscamos.
Ahora que ya sabemos redimensionar vídeos vamos a crear el grid estilo "tiles" de Windows. Veamos el camando y luego lo explicamos:
ffmpeg -i input0 -i input1 -i input2 -filter_complex "[1:v]scale=iw/2:-1[bottom1]; [2:v]scale=iw/2:-1[bottom2]; [bottom1][bottom2]hstack[down]; [0:v][down]vstack" output
Esta sería la parte inferior del vídeo. Aquí dividimos el ancho del vídeo entre dos para conseguir poner uno al lado del otro. El -1 indica que el alto se ajuste automáticamente según los tamaños disponibles manteniendo el aspect ratio original.
Como resultado tendremos un esquema como el que viste en la imagen del principio.
Con estos ejemplos vamos a aprender a modificar el audio de los vídeos con ffmpeg. Veamos algunos ejemplos
Sacamos la información de esta página de la wiki oficial.
ffmpeg -i input.mp4 -af "volume=1.5" output.mp4
Recibimos el vídeo, le aumentamos el volumen hasta el 150% y obtenemos la salida.
Con este parámetro podemos eliminar todo el audio de la salida:
ffmpeg -i input.mp4 -an output.mp4
Para ello vamos a imaginar que tenemos varios inputs de vídeo cada uno con su audio, la mayoría es ruido de fondo por lo que descartamos los audios de todos salvo de un vídeo.
ffmpeg -i input0.mp4 -i input1.mp4 -i input2.mp4 -map 0 -map 1 -map -1: a:0 -map 2 output.mp4
En este ejemplo eliminamos todas las pistas de audio de todos los vídeos salvo la primera pista de audio de input1 representado por:
: a
debido a que en github convierte esa a en un icono. Cuando lo escribas hazlo sin espacio
en este caso concreto, como delante de este valor ponemos un
-
(-1: a:0) lo que hacemos es negarlo.Por tanto, en realidad le estamos diciendo
es decirle a ffmpeg: "no cogas el audio a
, con índice 0
del input 1
. Y ffmpeg
actúa dejando intacto ese audio para que aparezca en el output final.En este listado de ficheros encontrarás comandos útiles para realizar ciertas tareas con ffmpeg. Desde redimensionar un vídeo hasta crear grid con ellos.