jueves, 25 de abril de 2019

Bailando con el FFMPEG

A veces me pide el cuerpo resumir, en una única entrada, todo lo que he ido hablando sobre un tema. Y suelo titularla ‘Bailando con...’, seguro que recordando aquel ‘Bailando con lobos’ de Kevin Costner. Bueno, pues hoy bailaré con el FFMPEG, cuyo conocimiento (elemental, claro) me ha facilitado bastantes cosas. No es casualidad que, de hecho, esta potentísima herramienta está ‘en las cocinas’ de muchísimas aplicaciones gráficas, como VLC, OpenShot, desde luego en casi todos los editores de video… y también en las facilidades que se ofrecen en plataformas como Youtube, iTunes, etc.

Por supuesto que haciendo una búsqueda, en este Blog, por ‘ffmpeg’, aparecerán todas esas entradas donde lo menciono pero, como digo, me apetece hacer una especie de extracto de lo que tengo desperdigado por el Blog.
Además, hace unos 15 días el Blog de SoloLinux, que suelo visitar con frecuencia, publicó un interesante Manual de FFMPEG que me aclaró algunas ideas.
Así que empecemos...

1- Conceptos genéricos sobre el FFMPEG
El primero, que es una herramienta potentísima, y que dominarla solo está al alcance de un usuario PRO. Ya expliqué aquí (y en los ejemplos que siguen se verán bastante) eso de las opciones globales para definir codecs, bitrates, resoluciones..., etc, lo único a añadir es la idea de que todos los archivos que no esté precedidos por (-i) se consideran archivos de salida y que si quieres usar el mismo nombre en la entrada y en el archivo de salida, debes agregar la etiqueta (-y) antes del nombre del archivo de salida.
Comentar, también, que ordenes como ‘ffmpeg -codecs’ (o -formats, o -encoders…) nos presentan la información del potencial de ffmpeg. Igualmente, podemos ver claramente las características de un archivo multimedia con la orden ‘ffmpeg -i nombre_archivo -hide_banner
Y, al final, hablaré de los filtros, que es un mundo muy amplio, e interesante, dentro del FFMPEG.


2- Operaciones típicas con formatos multimedia (audio y video)
Cortar y unir audios y videos
Lo más cómodo (aunque hay otras formas) es usar la notación -ss HH:MM:SS (definirá el instante de Inicio) y -to HH:MM:SS (para el Final del corte). Si es corte es ‘hasta el final’ puede prescindirse de ‘-to...’. Ejemplos de instrucciones: 
ffmpeg -i audio.mp3 -ss 00:00:10 -to 00:03:30 audio_cortado.mp3 
En el caso de los videos conviene añadir el mandato -qscale 0 para mantener la calidad. 
ffmpeg -i video.avi -ss 00:03:15 -qscale 0 video_cortado.avi
Nota: si hay problemas, puede usarse este otro mandato...
ffmpeg -i mivideo.mp4 -ss 00:00:00 -to 00:13:04 -async 1 mivideocortado.mp4 
(esta orden, evidentemente, corta y guarda el video desde el comienzo hasta los 13 minutos y 4 segundos. Aunque, como ya decía hace tiempo, el Avidemux es una herramienta muy cómoda, y rápida, para manejar videos,
lo decía aquí.

Unir (concatenar) archivos multimedia
Para hacerlo con ffmpeg, primero hay que meter los archivos en una carpeta, crear una lista (archivo de texto, llamémosle, por ejemplo, 'lista.txt') escribiendo en líneas...
file archivo1.mp3
file archivo2.mp3

etc...
(es básico, en cada línea creada, anteponer al nombre del archivo la palabra ‘file’)
y luego ejecutar, desde esa carpeta, la orden 

ffmpeg -f concat -i lista.txt -c copy output.mp3  
El problema es que los archivos a unir han de ser homogéneos (desde luego con la misma extensión y, en el caso de archivos de video, con igual resolución, codecs, etc), por lo que obligaría, posiblemente, a tener que transcodificarlos previamente, para ‘homogeneizarlos’
NOTA: para archivos de mp3, otra forma sencilla es hacerlo con el modificador ‘cat’ 

cat audio1.mp3 audio2.mp3... audio_n.mp3 > audio_unido.mp3

Convertir (trascodificar) archivos multimedia 

Con FFMPEG podemos cambiar el formato, los codecs (y los bitrates, y un montón de cosas más), etc. Basta indicar entrada y salida, pero es mejor introducir parámetros para fijar codecs, bitrate, etc, y evitar que se dispare el tamaño. Por ejemplo... 
ffmpeg -i audio.flac -codec:a libmp3lame -b:a 128k -ar 44100 -ac 2 output.mp3 
(aquí recodificamos un audio en 'flac' a mp3, con el codec libmp3lame, y le indicamos que lo 'saque' con bitrate 128 kbps, a 44100 Hz y 2 canales (estereo)).
Y, de modo parecido, pasaríamos un video (en 'mpg') a formato 'avi', con el codec mpeg4, con ... 
ffmpeg -i archivo.mpg -f avi -vcodec mpeg4 -b:v 1200k -b:a 128k output.avi
(se puede dejar de poner alguno de estos parámetros, y usará el valor por defecto, o el del archivo de entrada). El '-f (force) avi' quizás no sea necesario. 

NOTA de interés: descargo muchas veces, desde youtube, videos con formato MP4. El problema es que, si los quiero ver, metidos en un pendrive, en mi TV (que es una Sansung), no me reconoce el formato. Lo que hago es convertirlos a formato MKV (contenedor matroska). simplemente con el comando
ffmpeg -i input.mp4 -qscale 0 output.mkv
y me quedan bastante bien de calidad y tamaño. 
(para no armarme lío, y dar error si el nombre del archivo es largo, y con palabras separadas, lo suelo renombrar a 'input' y luego, si acaso, vuelvo a renombrar el 'output').

Reparar un video
Si tenemos problemas de reproducción con un archivo de video, puede ser bueno generar un nuevo fichero, conservando la calidad del audio y el video, con FFMPEG, para ver si así se puede solucionar. Se haría, sencillamente, con  
ffmpeg -i original.avi -c:v copy -c:a copy original_reparado.avi

Extraer audio de un video 

ffmpeg -i video.avi -ab 128k audio.mp3 
(si no se indica bitrate, por defecto te sale con un bitrate de 64k (64000))

Eliminar el audio de un video 

ffmpeg -i video.mpg -c copy -an video_mudo.mpg

Añadir audio a un video ‘mudo’ 

ffmpeg -i video.avi -i input.mp3 -c copy -map 0:0 -map 1:0 output.avi

Extraer imágenes de un video 

Como los videos van a unas 24 frames por segundo, lo ideal es extraer estas frames (imagenes) cada cierto intervalo (segundos) de tiempo, porque si no serían muchísimas. Así que se emplea esta orden: 
ffmpeg -i video.webm -vf fps=fps=1 IMG%03d.png 
'fps=1' significa que tomas 1 frame por segundo. Se puede poner, por ejemplo fps=0.2 que sería una captura cada 5 segundos (ojo, los decimales, en FFMPEG, siempre con 'punto'). 
Y ‘nombre%03d’ permite que se guarden secuencialmente y, en este caso, numeradas con 3 dígitos (001, 002… 999), para así tenerlas perfectamente ordenadas. 
Por cierto, quizás esta entrada pueda aportar ideas complementarias

Crear un GIF 
Bueno, tampoco me voy a enrollar, como puede haber diferentes métodos, mejor verlo aquí

Ripear un DVD de video con FFMPEG
Vamos a la carpeta TS_VIDEO y la copiamos en (por ejemplo) nuestro Escritorio
Vemos todos los archivos *.VOB de la carpeta
Abrimos una terminal en la ruta de esa carpeta y ‘concatenamos’, poniendo en el mismo orden esos archivos *.VOB. Al resultado le llamamos Temp.VOB. La orden sería, por ejemplo, esta…
cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB > Temp.VOB
Ahora en la misma ruta, basta hacer…
ffmpeg -i temp.VOB -vcodec libxvid -qscale 0 Nombre_Video.avi
(NOTA ‘qscale 0’ es la notación recomendada para mantener la calidad. Antes se usaba ‘-sameq’). También puede probarse con

ffmpeg -i Temp.VOB -f avi -vcodec mpeg4 -b:v 1200k -b:a 128k output.avi


3- Operaciones con filtros
Una de las caracteristicas del ffmpeg es la posibilidad de usar ‘filtros’ para modificar cosas. Hay muchos filtros, se indican, según sean de audio o video, mediante -af (o -vf) seguido, dentro de unas comillas dobles, por el filtro y el valor que le demos. Se pueden poner varios filtros, dentro de las mismas comillas, separándolos por una coma, o varios valores, separándolos por dos puntos (:). 
Algunos ejemplos de operaciones con filtros pueden ser... 
Ajustar el volumen de un audio
ffmpeg -i audio.mp3 -af "volume=X" audiomodificado.mp3
NOTA: ‘X’ es el multiplicador: por ejemplo, X=2, para aumentar al doble el volumen (o X=1,5 para aumentarlo solo el 50%, o X=0,75 si quisiéramos reducir dicho volumen en un 25%) 

Con Videos: aumentar volumen del audio
ffmpeg -i video.avi -vol 2048 -vcodec copy video_masvolumen.avi
El volumen 'normal' es -vol 256, si queremos doblarlo pondríamos -vol 512 (etc). Con el valor -v 2048 parece ser que se obtiene el maximo volumen sin producir saturación en el sonido de origen del video.

Rotar un video 
A veces nos sale en video girado, y habría que rotarlo. 
El muy típico volteo horizontal de un video lo haremos, fácilmente, con la orden 
ffmpeg -i entrada.avi -vf "hflip" salida.avi
También se puede usar el filtro/modificador “transpose=...”. Este modificador puede adoptar estos valores: “transpose=0” para rotar 90º en el sentido contrario de las agujas del reloj y giro vertical (es el valor por defecto). “transpose=1”, para rotar 90º en el sentido de las agujas del reloj. ...=2 para rotar 90º en el sentido contrario a las agujas del reloj y “transpose=3” para rotar 90º en el sentido de las agujas del reloj y giro vertical. Una orden sería, por ejemplo, 

ffmpeg -i video.mp4 -vf “transpose=1” video_rotado90.mp4 

Modificar la resolución (dimensión) de un video 
ffmpeg -i video.mp4 -vf "scale=w=800:h=600" video2.mp4 

Modificar la velocidad de reproducción 
Termino con este ‘curioso’ filtro para modificar la velocidad de reproducción de archivos multimedia
En los videos
El filtro para modificar la velocidad de reproducción de un video es “setpts=…*PTS“. Debe tenerse en cuenta que a mayor valor se obtiene una reproducción más lenta. Por ejemplo, para doblar la velocidad de reproducción (cámara rápida): 
ffmpeg -i video.mp4 -vf "setpts=0.5*PTS" video1.mp4
Mientras que, para disminuirla (por ejemplo) a la mitad (cámara lenta) usaremos…
ffmpeg -i video.mp4 -vf "setpts=2.0*PTS" video1.mp4
Nota: PTS (Presentation Time Stamp) es un metadato del archivo de video que tiene que ver con la sincronización y los frames marco. 
En los audios
 El filtro es, en este caso, el “atempo=...“. Pero solo toma valores entre 0.5 (que es reproducir a mitad de velocidad) y 2.0 (al doble). Por ejemplo 
ffmpeg -i audio.mp3 -af "atempo=0.75" audio2.wav
Claro que siempre se puede llegar a otros valores, concatenando filtros. Por ejemplo, para cuadruplicar la velocidad de reproducción de un audio pondríamos... 
ffmpeg -i audio.mp3 -af "atempo=2.0,atempo=2.0" audio1.mp3

Bien, y acabo aquí. Por supuesto, hay muchísima más información sobre FFMPEG, y lo que puede hacer, buscando con Google.

1 comentario:

  1. Gracias, me sirvió bastante. Dios te bendiga abundantemente en bendiciones materiales y espirituales.

    ResponderEliminar