erknrio
3/8/2017 - 5:27 PM

Comandos útiles de ffmpeg.

Comandos útiles de ffmpeg.

Índice de utilidades

Index.

Introducción

Redimensionamos un vídeo mediante filter_complex.

Reescalando un vídeo

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.

Índice de utilidades

Index.

Introducción

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.

Grabar el monitor principal

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

Explicación general de los comandos

Comando generales

  • -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.

Comandos x11grab, entrada de vídeo

  • 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.

Comandos alsa, entrada de audio

  • 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.

Grabar monitor secundario

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

Formato vídeo 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.

Formatos de audio soportados

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.

Fusionar varios vdeos

¡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 ;-).

Documentación

Aclaraciones previas:

  • Input == entrada de vídeo / audio.
  • Output == salida de vídeo / audio.

Oficial

Índice de utilidades

Index.

Introducción

Crear múltiples overlays en un vídeo principal.

Ejemplo de funcionamiento explicado con variables

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;

ffmpeg + filter_complex

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:

  • -i: el vídeo principal que usaremos de base.
  • -filter_complex: parámetro empleado para aplicar filtros.
  • movie: lee el audio / video que recibe. Consulta la documentación para más detalles.
  • overlay: solapa las miniaturas al vídeo principal según los tamaños establecidos. Consulta la documentación.
  • W: ancho del vídeo principal.
  • w: ancho del vídeo a solapara.
  • H: alto del vídeo principal.
  • h: alto del vídeo a solapar.

Documentación

Índice de utilidades

Index.

Introducción

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.

Reescalando un vídeo

Por simplicidad esta parte de la documentación ha sido movida a un ffmpeg-scale.md.

Creando el grid

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
  • -i inputX: Estos son los vídeos que usaremos para crear nuestro grid.
  • -filter_complex: aplica los filtros de reescalado y el grid.
  • [X:v]: indica el vídeo de entrada. 0 es el primero, 1 el segundo, etc.
  • scale=iw/2:- 1: IMPORTANTE el "- 1" va sin espacios, tiene un espacio entre el "-" y el "1" porque github lo convierte a un icono de dislike.

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.

  • [bottomX]: esta es una etiqueta que se pone al reescalado para luego confeccionar el grid de una forma más sencilla. Si te fijas, al primer input no le ponemos etiquetas ya que se usa tal cual.
  • hsctack: es un filtro original que acopla vídeos, en nuestro ejemplo,
  • los dos que hemos redimensionado (bottom1 y bottom2). Posteriormente creamos otra etiqueta que hace reeferencia a estos dos vídeos una vez unidos llamada [down].
  • vstack: Ahora vamos a acoplar los vídeos verticalmente. Para ello decimos que en la parte superior estará el [0:v] que equivale al input0 mientras que en la inferior ponemos [down]*

Como resultado tendremos un esquema como el que viste en la imagen del principio.

Documentación

Índice de utilidades

Index.

Introducción

Con estos ejemplos vamos a aprender a modificar el audio de los vídeos con ffmpeg. Veamos algunos ejemplos

Cambiar el volumen

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.

Eliminamos todo el audio

Con este parámetro podemos eliminar todo el audio de la salida:

ffmpeg -i input.mp4 -an output.mp4

Eliminar todo el audio excepto uno

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:

  • -map 1: obtenemos los streams del input 1. Si fuera -map 2 sería del input2, etc.
  • -map -1: a:0: IMPORTANTE el comando está escrito con un espacio : 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.

Introducción

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.

Listado de comandos