lunes, 17 de diciembre de 2012

17 cosas útiles que puedes hacer con ffmpeg y algunos conceptos de video digital

En este post os voy a enseñar (muy por encima) a utilizar ffmpeg para:
  1. transformar archivos multimedia
  2. editar las etiquetas id3 tags de archivos de audio
ffmpeg funciona en línea de comandos, y es el programa que usan entre bambalinas muchos de los programas con entorno gráfico utilizados para transformar archivos multimedia.

(El caracter $ antes de cada comando representa el prompt de la shell).

1. Para saber si tienes instalado ffmpeg:

$ dpkg -l ffmpeg | grep ii

Si lo tienes instalado, te devolverá algo como esto:
ii  ffmpeg       4:0.8.4-0ubuntu0.12.04.1 Multimedia player, server, encoder and transcoder (transitional package)

2. Si no lo tienes instalado, para instalarlo:

$ sudo apt-get install ffmpeg
Ahora debes fijarte bien si más abajo te dice algo sobre paquetes sugeridos o paquetes recomendados. Si te pone paquetes recomendados, te sugiero que copies los nombres de todos esos paquetes, canceles la instalación pulsando "n" y hagas $ sudo apt-get install ffmpeg (copia aquí los nombres de los paquetes recomendados).
Te aconsejo que te olvides de los paquetes sugeridos.

3. Sintaxis de ffmpeg:

ffmpeg funciona del siguiente modo: le pasamos un archivo de entrada que queremos transformar y unos modificadores de ese archivo de entrada, y un archivo de salida con una serie de modificadores de dicho archivo de salida.
$ ffmpeg [opciones_archivo_entrada] -i archivo_entrada [opciones_archivo_salida] archivo_salida

4. Tratamiento de archivos de video con ffmpeg:

4.1. Principales modificadores:


-b Nk ----> establece a N el bitrate (nº de kbps) en el archivo de salida:
$ ffmpeg -i archivo_entrada.avi -b 1600k archivo_salida.avi

-r N ----> establece a N el nº de frames por segundo en el archivo de salida:
$ ffmpeg -i archivo_entrada.flv -r 50 archivo_salida.flv

-s NxM ----> establece a NxM el tamaño de cada frame (resolución):
$ ffmpeg -i archivo_entrada.mp4 -s 800x600 archivo_salida.mp4

-aspect XU:UV ----> establece la relación de aspecto a XU:UV. Por ejemplo, -aspect 16:9:
$ ffmpeg -i archivo_entrada.avi -aspect 16:9 archivo_salida.avi

-acodec codecX ----> codificará el audio del video de salida utilizando el codec de audio "codecX"

-vcodec codecX ----> codificará la sucesión de imágenes del video de salida utilizando el codec de video "codecX"


4.2. Códecs, formatos y contenedores

4.2.1. FORMATOS

Para ver qué formatos de audio y de video admite ffmpeg, haz esto:
$ ffmpeg -formats
  • Primera columna (recuadro rojo) ----> ffmpeg puede decodificar (D) y/o codificar (E) dicho formato.
  • Segunda columna (recuadro azul) →nombre del formato.
  • Tecera columna (recuadro verde) →descripción del formato.


Algunos formatos de audio frecuentes: mp3, aac, m4a, ac3, ogg, FLAC.
  • mp3, aac, m4a son formatos privativos (NO LIBRES) de compresión con pérdida de calidad.
  • ogg es un formato libre de compresión con pérdida.
  • FLAC es un formato libre de compresión sin pérdida de calidad (sería como tener el disco original).

Algunos de los formatos de video más frecuentes son divx, xvid, h264, x264, mpeg4, vp8, theora y muchos más.

  • mpeg4 ----> admite aceleración por hardware.
  • h264 ----> admite aceleración por hardware y es de código cerrado.
  • x264 ----> igual que h264 pero libre.
  • theora ----> alta compresión en formato libre.
  • vp8 ----> alta calidad en formato libre.
  • divx ----> mejor que mpeg4. El audio se codifica en mp3. Código cerrado.
  • xvid ----> igual que divx pero libre.

 4.2.2. CÓDECS 

Podemos entender los codecs como un conjunto de programas o librerías que utiliza ffmpeg para codificar y decodificar archivos. Según el tipo de contenedor que utilicemos, tenemos que decirle o no a ffmpeg el codec o códecs que queremos que utilice para codificar el archivo de salida.
Para ver la lista de códecs disponibles en ffmpeg
 $ ffmpeg -codecs
No todos los códecs son iguales. En la primera columna, el comando anterior te devuelve para cada codec esta leyenda:
  • D….. = Decoding supported.
  • .E…. = Encoding supported.
  • ..V… = Video codec.
  • ...A… = Audio codec.
  • ....S… = Subtitle codec.
  • ..…S.. = Supports draw_horiz_band.
  • .…..D. = Supports direct rendering method 1.
  • .…...T = Supports weird frame truncation.


4.2.3. CONTENEDORES

Un archivo de video no es más que una sucesión de imágenes acompañadas de sonido. Obviamente, tenemos que meter todo eso en un contenedor.
  • avi ----> muy extendido por compatibilidad, aunque queda muy atrás en cuanto a calidad con respecto a mp4, mkv, o webm.
  • flv ----> contenedor típico para videos en flash.
  • mkv ----> admite FullHD y es de código abierto.
  • mp4 ----> admite FullHD.
  • webm ----> admite FullHD. Tiene como peculiaridad que sólo soporta ogg como fomato de audio y vp8 como formato de video, de manera que si transformas un video a webm, no es necesario decirle a ffmpeg qué codecs tiene que utilizar, puesto que él ya lo sabrá.

4.3. Cambiar de formato archivos de video

modificadores importantes en cambios de formato de video:
  • -vcodec codecX ----> codificará la sucesión de imágenes del video de salida utilizando el codec de video "codecX"
  • -acodec codecX ----> codificará el audio de salida utilizando el codec de audio "codecX".
  • -sameq ----> conserva en el archivo de salida la calidad del archivo de entrada a pesar del cambio de formato.
  • -pix_fmt rgbXYle ----> útil para garantizar que se conserva la calidad cuando cambiamos la resolución o la relación de aspecto (modificadores -s y -aspect). Este modificador, sustituye el formato del píxel original predeterminado, que contiene 16 bits de información, por otro que contiene XY bits de información.
Convierte un archivo de entrada en contenedor mp4 en un archivo de salida en contenedor avi con un bitrate de 870kbps y una resolución de 1024x768. Los formatos de salida son xvid para el video y mp3 para el audio debido a los códecs utilizados.
$ ffmpeg -i archivo_entrada.mp4 -b 870k -s 1024×764 -acodec libmp3lame -vcodec libxvid archivo_salida.avi

Convierte un video en contenedor mp4 en uno en contenedor mkv. Los formatos de audio y de video son ogg o x264. El archivo de salida conserva la calidad del original gracias al modificador -sameq.
$ ffmpeg -i archivo_entrada.mp4 -sameq -acodec libvorbis -vcodec libx264 archivo_salida.mkv

Transforma un archivo de entrada en contenedor mp4 en un archivo en contenedor webm. Los formatos de audio y de video son forzosamente ogg y vp8 ya que webm no soporta otros, de ahí que no haya necesidad de especificar los códecs a utilizar en  este caso. El archivo de salida conserva la calidad del original gracias al modificador -sameq.
$ ffmpeg -i archivo_entrada.mp4 -sameq archivo_salida.webm

Transforma un archivo en contenedor mp4 en otro en webm. Los formatos ya sabemos que son ogg (audio) y vp8 (video). Se conserva la calidad del archivo original gracias a los modificadores -sameq y -pix_fmt rgb48e que sustituye el formato del pixel original predeterminado con 16 bits de información, por otro que contiene 48 bits de información.
Por otro lado, se fuerza a que la resolución del video de salida sea de 192x1080 con una relación de aspecto de 16:9.
$ ffmpeg -i archivo_entrada.mp4 -sameq -pix_fmt rgb48le -s 1920×1080 -aspect 16:9 archivo_salida.webm

4.4. Extraer de un video una secuencia de imágenes

$ ffmpeg -i video_entrada -sameq -r 10 imagen%d.png
Extrae del video de entrada 10 imágenes por segundo y las almacena en el directorio actual con el nombre imagen1.png, imagen2.png, imagen3.png…… imagenN.png en orden ascendente.

4.5. Crear un video a partir de una secuencia de imágenes

$ ffmpeg -i imagen%d.png  -sameq video_salida.mkv
Crea un video en contenedor mkv partiendo de la secuencia de imágenes imagen1.png, imagen2.png, imagen3.png, ..... , imagenN.png

4.6. Quitar el sonido de un video

$ ffmpeg -i VideoEntrada -sameq -an VideoSalida

4.7. Extraer el sonido de un video

$ ffmpeg -i video_entrada -sameq audio_video.flac
Extrae el sonido del video de entrada sin pérdida de  calidad y lo almacena en el archivo audio_video.flac (recuerda que el formato flac es un algoritmo de compresión de audio sin pérdida).

$ ffmpeg -i video_entrada -ab 192k audio_video.ogg
Extrae el sonido del video de entrada con pérdida de calidad. Y lo almacen en el archivo audio_video.ogg, en el que el bitrate de audio será de 192kbps.


4.8. Insertar nuevo audio en un archivo de video (necesitas que el archivo de video NO tenga sonido)

$ ffmpeg -i archivo_audio.mp3 -i video_sin_audio.avi -sameq nuevo_video+audio.avi


4.9. Unir varios videos en uno (necesitas tener dichos videos en mpeg)

$cat video1.mpeg video2.mpeg video3.mpeg videoN.mpeg >video_final.mpeg

4.10. Acortar un video

Genera un video de salida a partir del segundo 132 del video de entrada:
$ ffmpeg -i video_entrada -sameq -ss 132 video_salida

Genera un video de salida que dure 10 minutos justos.
$ ffmpeg -i VideoOriginal -sameq -t 600 VideoFinal


5. Tratamiento de archivos de audio con ffmpeg

5.1. Ver las etiquetas Id3, o los comentarios de un archivo de audio

$ ffmpeg -i audio_entrada


Si quieres enviar dicha información a una tubería para ser tratada por un segundo comando:
$ ffmpeg -i audio_entrada 2>&1 |  comando2
Fíjate que redirijo la salida de error estándar hacia el descriptor de la salida estándar del comando. Esto es así porque al no especificar ningún archivo de salida, resulta que la salida de ffmpeg se envía a la salida de error estándar. De no poner ese 2>&1 no iría ninguna información al comando 2 de la tubería.

Ejemplo:
$ ffmpeg -i vnv_nation-lightwave.ogg 2>&1 | tr [:upper:] [:lower:] | grep artist | awk -F": " '{ print $2 }'
Esto devuelve: vnv nation

$ ffmpeg -i vnv_nation-lightwave.ogg | tr [:upper:] [:lower:] | grep artist | awk -F": " '{ print $2 }'
Esto devuelve por pantalla lo mismo que $ffmpeg -i vnv_nation-lightwave.ogg y eso es porque la salida de ffmpeg no ha ido a la tubería.


5.2. Conversión a otros formatos de audio


Modificadores más importantes:

  • -acodec códecX ----> igual que en vídeo.
  • -aq N ----> Audio quality. N es un número de 1 a 9. 1 para que el archivo de audio de salida tenga la calidad más baja y 9 para la más alta. Con un 5 el archivo de salida tendrá un bitrate de unos 160kbps y con un 6, unos 192kbps.

Si quiero pasar de formato flac a ogg con un bitrate de 192 kbps para el archivo de salida:
$ ffmpeg -i audio_entrada.flac -acodec libvorbis -aq 6 audio_salida.ogg

Si quiero generar un archivo en formato aac con un bitrate de 192kbps partiendo de un archivo original en formato flac:
$ ffmpeg -i audio_entrada.flac -acodec libvo_aacenc -aq 6 audio_salida.aac

Si quiero generar un archivo en formato mp3 con un bitrate de unos 224 kbps partiendo de un archivo en formato wav:
$ ffmpeg -i audio_entrada.wav -acodec libmp3lame -aq 7 audio_salida.mp3

Si quiero generar un archivo en formato flac partiendo de un archivo en formato wav:
$ ffmpeg -i audio_entrada.wav -sameq -acodec flac audio_salida.flac


5.3. Escribir / modificar las etiquetas id3 de los archivos de audio

modificadores importantes:
  • -map_metadata -1 ----> borras las etiquetas id3 del archivo de entrada, o generas un archivo de salida igual que el de entrada sin etiquetas id3.
  • -metadata campo="nombre_del_campo" ----> generas un archivo de salida con etiqueta id3 con un campo y su valor. ejemplo: -metadata artist="the rolling stones"

Para borrar todas las etiquetas id3 del archivo de entrada. Genero un archivo de salida igual que el de entrada, pero sin etiquetas id3 o comentarios.

$ ffmpeg -i audio_entrada.aac -map_metadata -1audio_salida.aac

Las etiquetas id3, se conservan por defecto, incluso al cambiar de formato un archivo. Para pasar de mp3 a ogg haciendo que el archivo de salida conserve las etiquetas id3 del archivo original:
$ ffmpeg -i audio_entrada.mp3 -acodec libvorbis -aq 6 audio_salida.ogg

Para incrustar etiquetas id3 en un archivo de audio, utilizamos -metadata de forma repetitiva, una vez por cada campo id3 que queremos incrustar en el archivo. Ejemplo, supongamos:
  • grupo música----> vnv nation
  • álbum ----> matter and form
  • título ----> lightwave
  • número de pista ----> 10
  • año del álbum ----> 2005
  • género ----> electrodark * (otros pondrían future pop, según como clasifiques).
  • discos que forman el álbum ----> 1 (luego es el disco 1 de 1)
$ ffmpeg -i audio_entrada.flac -acodec libvorbis -aq 6 -metadata title="lightwave" -metadata artist="vnv nation" -metada album_artist="vnv nation" -metadata album="matter and form" -metadata track="10" -metadata date="2012" -metadata genre="electrodark" -metadata disc="1/1" audio_salida.ogg


Bastante largo, y siento haberos soltado este turrón, pero es que la página de man de ffmpeg parece una enciclopedia, sólo que sin fotos xDDD.
Éstas son sólo las opciones más importantes, igual que en el último ejemplo sólo he puesto algunas de las etiquetas id3 que soporta ffmpeg, pero de verdad que hay mucho más. Os aseguro que más resumido no se puede si es que se quiere hacer un buen manual ;)

Si te ha gustado mi post, agradecer no cuesta nada, dame un "me gusta", un +1 o un lo que sea en los botones que tienes más abajo. Gracias ;)

PD: en unos dias pondré un script para pasar discos e incluso colecciones enteras a ogg, editando incluso las etiquetas id3 de los archivos