470 - ffmpeg o editar audio y vídeo desde la terminal
#ffmpeg es mi editor preferido en #linux para trabajar con vídeo y audio. ffmpeg te permite recortar, unir, subir el volumen, normalizar de forma muy sencilla
Si la semana pasada te hablé sobre yt-dlp
, hoy quiero hablarte sobre otra de herramientas que utilizo a diario y para una gran variedad de tareas. En gran medida, esta herramienta me ha permitido automatizar algunos de los procesos que realizo de forma habitual, permitiéndome dedicar mas tiempo a lo que me interesa en cada caso. Por ejemplo, en el caso de los podcast, me ha permitido centrarme en el contenido de los podcast, mas que en, por ejemplo, convertir el audio en vídeo, o al revés, como te comentaré mas adelante. Así ffmpeg
me permite editar audio y vídeo desde la terminal, ya sea de forma completamente automatizada o manual, pero siempre con el objetivo de ahorrarme mucho trabajo.
ffmpeg o editar audio y vídeo desde la terminal
Sobre ffmpeg
ffmpeg
es una herramienta de línea de comandos gratuita y de código abierto que se utiliza para convertir, grabar y reproducir archivos de audio y vídeo en diferentes formatos. Fue lanzada en 2000 y desde entonces se ha convertido en una de las herramientas de transcodificación y manipulación de medios más populares y utilizadas en la industria.
Con ffmpeg
, se pueden realizar diversas tareas, como cortar y fusionar archivos de audio y vídeo, cambiar el tamaño y la resolución de los vídeos, aplicar efectos y filtros a los medios, entre otras.
ffmpeg
es compatible con muchos formatos de archivo, incluyendo MPEG, AVI, MP4, FLV, WMV, MOV, MKV, entre otros. También es compatible con muchos codecs de audio y vídeo diferentes, lo que lo hace extremadamente versátil.
¿Es ffmpeg una herramienta exclusiva de Linux?
No, ffmpeg
no es una herramienta exclusiva de Linux. De hecho, ffmpeg
se puede utilizar en una amplia variedad de sistemas operativos, incluyendo Windows, macOS, y Linux, así como en sistemas operativos móviles como Android e iOS.
ffmpeg
es una herramienta de línea de comandos, lo que significa que se puede ejecutar a través de la terminal o línea de comandos de cualquier sistema operativo que lo soporte. Además, también hay interfaces gráficas de usuario (GUI) que se pueden utilizar para trabajar con ffmpeg
en sistemas operativos de escritorio.
En resumen, ffmpeg
es una herramienta multiplataforma y se puede utilizar en diferentes sistemas operativos, por lo que no es exclusiva de Linux.
¿Que características puedes encontrar en ffmpeg?
Algunas de las principales características de ffmpeg
son las siguientes,
- Conversión de formatos:
ffmpeg
es una herramienta muy versátil que puede convertir una amplia variedad de formatos de archivo de audio y vídeo. - Grabación y transmisión en tiempo real:
ffmpeg
permite la grabación y transmisión en tiempo real de audio y vídeo a través de protocolos de streaming. - Procesamiento de vídeo: con
ffmpeg
se pueden realizar muchas operaciones de procesamiento de vídeo, incluyendo recorte, cambio de tamaño, rotación, entre otros. - Procesamiento de audio:
ffmpeg
también ofrece una amplia variedad de funciones para el procesamiento de audio, como el cambio de velocidad, la normalización, la eliminación de ruido, entre otros. - Soporte de códecs:
ffmpeg
soporta una amplia variedad de códecs de audio y vídeo, lo que lo hace compatible con muchos formatos diferentes. - Soporte de filtros y efectos:
ffmpeg
cuenta con una amplia variedad de filtros y efectos que se pueden aplicar a los archivos de audio y vídeo. - Herramientas de línea de comandos:
ffmpeg
es una herramienta de línea de comandos que se puede utilizar en diferentes sistemas operativos. - Libre y de código abierto:
ffmpeg
es una herramienta gratuita y de código abierto, lo que significa que se puede utilizar, modificar y distribuir de forma gratuita. Está liberado bajo licencia GPL v2.
Sobre las interfaces gráficas
Existen multitud de interfaces gráficas que utilizan ffmpeg
para realizar todo tipo de operaciones. Y de nuevo, no son, ni mucho menos exclusivas de Linux, sino que también se encuentran en otros sistemas operativos. Así, a continuación, te puedo citar algunas, para cada uno de los sistemas operativos principales.
Interfaces gráficas para Linux
Algunas interfaces de usuario (GUI) de ffmpeg
para Linux,
- QWinFF: QWinFF es una interfaz de usuario gráfica para
ffmpeg
que es fácil de usar y cuenta con una amplia variedad de funciones para convertir, codificar y decodificar archivos de audio y vídeo. - Arista Transcoder: Arista Transcoder es una herramienta de conversión de vídeo con una interfaz gráfica de usuario que utiliza
ffmpeg
para realizar la conversión. La interfaz es muy intuitiva y fácil de usar. - Selene Media Encoder: Selene Media Encoder es una herramienta de conversión de medios de comunicación de código abierto que utiliza
ffmpeg
como backend. Cuenta con una interfaz de usuario gráfica y soporta la conversión de una amplia variedad de formatos de archivo. - FFQueue: FFQueue es una herramienta de conversión de vídeo que utiliza
ffmpeg
y cuenta con una interfaz gráfica de usuario fácil de usar. Es capaz de convertir múltiples archivos de vídeo en paralelo y cuenta con una variedad de opciones de configuración. - WinFF: WinFF es una interfaz gráfica de usuario para
ffmpeg
que permite la conversión de archivos de audio y vídeo en varios formatos diferentes. Está disponible tanto para Windows como para Linux y es fácil de usar.
Interfaces gráficas para Windows
En el caso de windows, te puedo indicar las siguientes,
- ffmpeg Batch AV Converter:
ffmpeg
Batch AV Converter es una herramienta de conversión de vídeo que utilizaffmpeg
como backend y cuenta con una interfaz gráfica de usuario fácil de usar. Permite la conversión por lotes de múltiples archivos de vídeo y audio. - Convertilla: Convertilla es una herramienta de conversión de archivos de audio y vídeo que utiliza
ffmpeg
como backend. Cuenta con una interfaz gráfica de usuario fácil de usar y soporta múltiples formatos de archivo. - XMedia Recode: XMedia Recode es una herramienta de conversión de vídeo que utiliza
ffmpeg
como backend y cuenta con una interfaz gráfica de usuario avanzada. Es capaz de convertir múltiples archivos de vídeo y audio en paralelo y cuenta con una amplia variedad de opciones de configuración. - Avanti GUI: Avanti GUI es una interfaz gráfica de usuario para
ffmpeg
que permite la conversión de archivos de vídeo y audio en diferentes formatos. Cuenta con una amplia variedad de opciones de configuración y soporta la conversión por lotes de múltiples archivos. - vídeo to vídeo Converter: vídeo to vídeo Converter es una herramienta de conversión de vídeo con una interfaz gráfica de usuario fácil de usar que utiliza
ffmpeg
como backend. Soporta la conversión de una amplia variedad de formatos de archivo de vídeo y cuenta con una variedad de opciones de configuración.
Interfaces gráficas para MacOS
En el caso de MacOS, encontré las siguientes, pero, como te puedes imaginar, no he probado ninguna de ellas,
- Adapter: Adapter es una herramienta de conversión de vídeo que utiliza
ffmpeg
como backend y cuenta con una interfaz gráfica de usuario fácil de usar. Soporta la conversión de múltiples archivos de vídeo y audio y cuenta con una amplia variedad de opciones de configuración. - SmartConverter: SmartConverter es una herramienta de conversión de archivos de audio y vídeo que utiliza
ffmpeg
como backend. Cuenta con una interfaz gráfica de usuario fácil de usar y soporta múltiples formatos de archivo. - HandBrake: HandBrake es una herramienta de conversión de vídeo de código abierto que utiliza
ffmpeg
como backend. Cuenta con una interfaz gráfica de usuario avanzada y es capaz de convertir múltiples archivos de vídeo en paralelo. - ff·Works: ff·Works es una herramienta de conversión de vídeo que utiliza
ffmpeg
como backend y cuenta con una interfaz gráfica de usuario avanzada. Soporta la conversión de múltiples formatos de archivo y cuenta con una amplia variedad de opciones de configuración. - iffmpeg: iFFmpeg es una herramienta de conversión de vídeo que utiliza
ffmpeg
como backend y cuenta con una interfaz gráfica de usuario avanzada. Es capaz de convertir múltiples archivos de vídeo y audio en paralelo y cuenta con una amplia variedad de opciones de configuración.
Interfaces gráficas para Android
En el caso de Android, podrías utilizar las siguientes,
- Media Converter: una aplicación gratuita que permite convertir archivos de audio y vídeo en Android.
- vídeo Converter Android: una aplicación gratuita que permite convertir archivos de vídeo en Android.
- ffmpeg Media Encoder: una aplicación gratuita que permite codificar y transcodificar archivos de audio y vídeo utilizando
ffmpeg
en Android. - AndroVid: una aplicación gratuita que permite editar vídeos en Android y utiliza
ffmpeg
como backend. - Timbre: una aplicación gratuita que permite editar audio y vídeo en Android y utiliza
ffmpeg
como backend.
¿Que puedo hacer en la terminal?
Conversión de formatos de audio y vídeo
ffmpeg
puede convertir archivos de audio y vídeo de un formato a otro, permitiendo a los usuarios reproducir y editar archivos en diferentes dispositivos y software. Por ejemplo, para convertir algunos formatos de audio, podrías hacer lo siguiente,
- Convertir de MP3 a WAV:
ffmpeg -i input.mp3 output.wav
- Convertir de WAV a MP3:
ffmpeg -i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3
En este caso, -vn indica que no se debe incluir vídeo en la salida, -ar 44100 indica la frecuencia de muestreo del audio, -ac 2 indica que el audio debe ser convertido a estéreo y -b:a 192k indica la tasa de bits del audio.
- Convertir de FLAC a MP3:
ffmpeg -i input.flac -ab 320k output.mp3
Aquí, -ab 320k indica que el audio debe ser convertido a una tasa de bits de 320 kbps.
- Convertir de AAC a MP3:
ffmpeg -i input.aac -b:a 192k output.mp3
Para este caso, -b:a 192k indica que el audio debe ser convertido a una tasa de bits de 192 kbps.
En el caso de formatos de vídeo, también se pueden cosas similares, pero como te puedes imaginar, algo mas complejas.
- Convertir de MP4 a AVI:
ffmpeg -i input.mp4 output.avi
- Convertir de AVI a MP4:
ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k output.mp4
En este caso, -c:v libx264 indica que el vídeo debe ser convertido utilizando el códec H.264, -crf 19 indica la calidad del vídeo (un valor más bajo indica una mayor calidad), -preset slow indica la velocidad de codificación (un valor más bajo indica una velocidad más lenta y una mejor calidad), -c:a aac indica que el audio debe ser convertido utilizando el códec AAC y -b:a 192k indica la tasa de bits del audio.
- Convertir de MOV a GIF:
ffmpeg -i input.mov -s 320x240 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > output.gif
En este caso, -s 320×240 indica el tamaño de la imagen de salida, -pix_fmt rgb24 indica el formato de píxeles de la imagen de salida, -r 10 indica la tasa de fotogramas del vídeo, -f gif indica que el formato de salida es GIF y gifsicle –optimize=3 –delay=3 > output.gif es un comando adicional para optimizar y ajustar el GIF resultante.
- Extraer un clip de vídeo de un archivo MP4:
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:30 -c:v copy -c:a copy output.mp4
En este caso, -ss 00:01:30 indica el tiempo de inicio del clip (1 minuto y 30 segundos), -t 00:00:30 indica la duración del clip (30 segundos), -c:v copy indica que el códec de vídeo debe ser copiado sin cambios y -c:a copy indica que el códec de audio debe ser copiado sin cambios.
Cambio de tamaño, recorte y rotación de vídeos
ffmpeg
permite ajustar la resolución y proporción de aspecto de los vídeos, recortar partes no deseadas y rotar la imagen. Por ejemplo, para cambiar tamaño, podrías hacerlo de la siguiente forma,
# Cambiar tamaño de un vídeo a 720p
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
# Cambiar tamaño de un vídeo a 480p
ffmpeg -i input.mp4 -vf scale=854:480 output.mp4
# Cambiar tamaño de un vídeo a 1080p
ffmpeg -i input.mp4 -vf scale=1920:1080 output.mp4
En el caso de que lo quisieras recortar,
# Recortar un vídeo de 10 segundos desde el inicio
ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:10 -async 1 output.mp4
# Recortar un vídeo de 10 segundos desde el minuto 1
ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:10 -async 1 output.mp4
# Recortar un vídeo de 10 segundos desde el minuto 1 hasta el minuto 2
ffmpeg -i input.mp4 -ss 00:01:00 -t 00:01:00 -async 1 output.mp4
Y por último, para el caso del rotado, podrías hacerlo de la siguiente forma,
# Rotar un vídeo 90 grados en sentido horario
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# Rotar un vídeo 90 grados en sentido antihorario
ffmpeg -i input.mp4 -vf "transpose=2" output.mp4
# Rotar un vídeo 180 grados
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4
Creación de GIF animados
ffmpeg
puede convertir vídeos en formato GIF, permitiendo a los usuarios crear animaciones cortas con imágenes en movimiento.
Crear un GIF animado a partir de un vídeo:
# Crear un GIF animado de 10 segundos desde el segundo 30 del vídeo
ffmpeg -ss 00:00:30 -t 10 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -loop 0 output.gif
Crear un GIF animado a partir de una secuencia de imágenes:
# Crear un GIF animado a partir de una secuencia de imágenes numeradas
ffmpeg -framerate 10 -i frame_%04d.png -vf "scale=320:-1:flags=lanczos" -loop 0 output.gif
En estos casos, ss indica el tiempo de inicio, t indica la duración del GIF, fps indica la cantidad de cuadros por segundo, scale indica el tamaño de la imagen y loop indica si el GIF debe repetirse infinitamente.
Captura y grabación de vídeos
ffmpeg
puede capturar vídeos desde cámaras web, capturadores de pantalla y otros dispositivos, así como grabar vídeos desde la línea de comandos.
Capturar vídeo desde una cámara,
# Capturar vídeo desde la cámara y mostrarlo en tiempo real
ffmpeg -f v4l2 -i /dev/vídeo0 -vf "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='Camera 1':fontsize=30:fontcolor=white:x=10:y=10" -f sdl "vídeo Captured"
# Capturar vídeo desde la cámara y guardar en un archivo
ffmpeg -f v4l2 -i /dev/vídeo0 -vf "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='Camera 1':fontsize=30:fontcolor=white:x=10:y=10" output.mp4
Grabar la pantalla del escritorio,
# Grabar el escritorio y mostrarlo en tiempo real
ffmpeg -f x11grab -s 1920x1080 -i :0.0 -f alsa -i default -vf "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='Screen Capture':fontsize=30:fontcolor=white:x=10:y=10" -f sdl "Screen Captured"
# Grabar el escritorio y guardar en un archivo
ffmpeg -f x11grab -s 1920x1080 -i :0.0 -f alsa -i default -vf "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='Screen Capture':fontsize=30:fontcolor=white:x=10:y=10" output.mp4
En estos casos, v4l2 y x11grab son los dispositivos de captura de vídeo, s indica el tamaño de la pantalla, i indica la entrada de audio, drawtext es una función de filtro que permite agregar texto a la imagen, sdl es el dispositivo de salida y output.mp4 es el nombre del archivo de salida.
Transcodificación y streaming de vídeo
ffmpeg
puede transcodificar vídeos para adaptarlos a diferentes dispositivos y formatos de streaming, así como para reducir su tamaño y mejorar su calidad.
- Transcodificación de un archivo de video a diferentes formatos,
ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -b:a 192k output.mkv
En este caso, se toma un archivo de video input.mp4 y se transcodifica a un archivo output.mkv con el códec de video H.264 (libx264) y el códec de audio AAC. Además, se utiliza el preset veryfast para agilizar el proceso de transcodificación.
- Transcodificación y escalamiento de un archivo de video,
ffmpeg -i input.mp4 -vf scale=640:-1 -c:v libx264 -preset veryfast -c:a aac -b:a 192k output.mp4
En este caso, se toma un archivo de video input.mp4 y se transcodifica a un archivo output.mp4 con el códec de video H.264 (libx264) y el códec de audio AAC. Además, se utiliza el preset veryfast para agilizar el proceso de transcodificación. También se escala el video a una resolución de 640 píxeles de ancho, manteniendo la proporción de aspecto original.
- Streaming de video en tiempo real utilizando la herramienta ffserver,
ffserver -f ffserver.conf &
ffmpeg -i input.mp4 -vcodec copy -acodec copy http://localhost:8090/feed1.ffm
En este caso, se utiliza la herramienta ffserver para transmitir en vivo un archivo de video input.mp4. Primero, se ejecuta el archivo de configuración ffserver.conf utilizando el comando ffserver -f. Luego, se utiliza ffmpeg para enviar el video a ffserver utilizando el protocolo HTTP en la dirección http://localhost:8090/feed1.ffm
.
- Streaming de video a través de RTMP (Real-Time Messaging Protocol),
ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://server/live/stream_name
En este caso, se utiliza ffmpeg para transmitir en vivo un archivo de video input.mp4 utilizando el códec de video H.264 (libx264) y el códec de audio AAC. El video se envía a través del protocolo RTMP en la dirección rtmp://server/live/stream_name. Este caso asume que se tiene un servidor RTMP disponible y configurado para recibir el video.
Procesamiento de audio
ffmpeg
puede manipular archivos de audio para realizar tareas como normalización, recorte, conversión de formato y extracción de audio de vídeos. Te indico algunos casos prácticos para que veas lo sencillo que es y lo susceptible de automatizar algunas de las tareas que realizas habitualmente en lo que a edición de audio se refiere,
- Cortar una sección de audio,
ffmpeg -i input.mp3 -ss 00:00:30 -to 00:01:30 -c copy output.mp3
En este ejemplo, se está cortando una sección de audio desde los 30 segundos hasta 1 minuto y 30 segundos y se está guardando en un archivo llamado «output.mp3». La opción «-c copy» indica que se copiará el audio sin codificarlo nuevamente.
- Cambiar el volumen de un archivo de audio,
ffmpeg -i input.mp3 -filter:a "volume=2.0" output.mp3
En este caso, se está aumentando el volumen del archivo de audio en un 200%. El resultado se guardará en un archivo llamado output.mp3
.
- Convertir un archivo de audio de un formato a otro,
ffmpeg -i input.mp3 -vn -acodec pcm_s16le -ar 44100 output.wav
En este caso, se está convirtiendo un archivo de audio en formato MP3 a WAV. La opción «-vn» indica que no se incluirá ningún video en la salida, «-acodec» indica el códec de audio que se utilizará y «-ar» indica la frecuencia de muestreo del audio.
- Unir varios archivos de audio en uno solo,
ffmpeg -i "concat:input1.mp3|input2.mp3|input3.mp3" -c copy output.mp3
En este ejemplo, se están uniendo tres archivos de audio en uno solo. La opción concat
indica que se unirán varios archivos y la opción -c copy
indica que se copiará el audio sin codificarlo nuevamente.
- Se puede normalizar el volumen de un audio utilizando ffmpeg. Para ello, se puede utilizar el filtro «loudnorm» que está disponible a partir de la versión 2.8 de ffmpeg. Este filtro aplica una normalización de volumen según el estándar EBU R128 y tiene en cuenta el rango dinámico del audio para preservar la calidad y evitar la distorsión.
La sintaxis para normalizar el volumen de un archivo de audio con ffmpeg sería la siguiente,
ffmpeg -i input_audio.mp3 -af loudnorm output_audio.mp3
Donde:
input_audio.mp3
: es el archivo de audio de entrada.-af loudnorm
: indica que se va a aplicar el filtro loudnorm para normalizar el volumen.output_audio.mp3
: es el nombre del archivo de audio de salida.
El resultado de esta operación será un archivo de audio con el volumen normalizado según el estándar EBU R128
.
- Se puede eliminar el ruido de fondo utilizando ffmpeg. Para ello, se puede utilizar el filtro «noisereduction» que permite reducir o eliminar el ruido de fondo de un archivo de audio.
La sintaxis para eliminar el ruido de fondo de un archivo de audio con ffmpeg sería la siguiente,
ffmpeg -i input_audio.mp3 -af "highpass=f=200, lowpass=f=3000, noisereduction=p=0.05:s=0" output_audio.mp3
Donde,
input_audio.mp3
: es el archivo de audio de entrada.-af
: indica que se va a aplicar un filtro de audio.highpass=f=200, lowpass=f=3000
: es un filtro paso alto y un filtro paso bajo que ayudan a eliminar el ruido de frecuencias no deseadas.noisereduction=p=0.05
:s=0: indica que se va a aplicar el filtro de reducción de ruido con un perfil p de 0.05 y una cantidad de silencio s de 0.
El resultado de esta operación será un archivo de audio con el ruido de fondo eliminado o reducido. Es importante ajustar los valores de los filtros a las características específicas del archivo de audio y el tipo de ruido de fondo presente.
Conclusión
Creo que se me ha ido la mano con este podcast, pero es que las posibilidades que ofrece ffmpeg
son sencillamente espectaculares. Si la semana pasada, te hablaba sobre que yt-dlp
es una pura maravilla, lo cierto es que ffmpeg
es una auténtica barbaridad.