Comprimir todos los videos de un directorio sin perdida de calidad y multicore

Ideal para videos de cámaras digitales y demás.

Estaba reduciendo un poco un directorio que tengo con varias fotos ya que me quedé sin espacio en el backup, y se me ocurrió comprimir los videos que tenía de las viejas y ya poco usadas cámaras digitales. Y es que no tenían los mejores métodos de compresión.

Buscando por ahí me tope con este artículo en el que usa FFMpeg para dicha tarea.

El comando que usé fue este en cuestión, usa xargs para usar todos los cores que tengo disponibles (si FFMpeg soporta multi-threading, pero depende de como este compilado, el codec, y otras yerbas).

find . -type f -iname "*.avi" -print0  | xargs -0 -n1 -P 6 -I {}  ffmpeg -i {} -c:v libxvid -c:a libmp3lame -b:v 5000k -b:a 320k /ruta/para/archivos_comprimidos/{}

Paso a explicar las partes:

  • find . -type f -iname "*.avi" -print0: Busco todos los archivos que se llamen *.avi, -print0 hace que separe los nombres de archivo por *nullbyte*.
  • xargs -0 -n1 -P 6 -I {}...: Le paso uno por uno los archivos al comando, pero usando 6 forks en paralelo (mi numero de cores), e indicando que el nombre del archivo va a ser remplazado desde {}
  • ffmpeg -i {} -c:v libxvid -c:a libmp3lame -b:v 5000k -b:a 320k /ruta/para/archivos_comprimidos/{}: El comando de ffmpeg en cuestión, para ver mas información sobre este les recomiendo leer el artículo que encontré

Estoy casi seguro que les de tanto bitrate de video como de audio de sobra, y podría haber optimizado mas el proceso, pero la verdad que el resultado me dejó satisfecho, reduciendo unos 6GB en solo 2GB.