Revisando resolución de videos en bash
Publicado: 2023-02-05Ahora que tengo muchos videos en mi colección, ¿cómo saber qué resolución tienen? ¿Cómo saber si puedo reemplazar un video de baja resolución por un video de al menos 720p?
Lo primero es instalar una herramienta que nos permita saber, lo que se puede hacer con exiftool
:
sudo apt install libimage-exiftool-perl
Ahora podemos obtener el tamaño del video con el comando:
exiftool nombre_de_video
Hay mucho por ver, pero solo nos importa un atributo, Image Size:
exiftool nombre_de_video | grep "Image Size"
Con eso solo quedará una línea semante a la siguiente:
Image Size : 1280x720
Lo cual podemos dividir en dos campos: antes y después de los dos puntos. Esto lo podemos hacer con un comando cut -d:
, que implica cortar campos divididos por “:”. Y solo nos interesa la segunda parte, o el campo 2, por lo que el nuevo comando es:
exiftool nombre_de_video | grep "Image Size" | cut -f2 -d:
Aunque de eso nos sobra un espacio, por lo que lo pasamos a través de xargs
para eliminarlo:
exiftool nombre_de_video | grep "Image Size" | cut -f2 -d: | xargs
Y sobre eso, podemos volver a dividir sobre la x, para tener dos números, el ancho por el alto:
exif_output=$(exiftool "$archivo" | grep "Image Size" | cut -f2 -d: | xargs) video_w=$(echo $exif_output | cut -f1 -dx) video_h=$(echo $exif_output | cut -f2 -dx)
Y, bueno, eso era lo importante de esta entrada. Lo demás del siguiente código es mucho formato:
#/bin/bash # Analiza la resolución de los videos en un directorio. function imprimirImageSize { archivo="$1" # xargs sirve para eliminar espacios en blanco. exif_output=$(exiftool "$archivo" | grep "Image Size" | cut -f2 -d: | xargs) video_w=$(echo $exif_output | cut -f1 -dx) video_h=$(echo $exif_output | cut -f2 -dx) printf " %-4s | %-4s |" "$video_w" "$video_h" } # Por cada temporada de la serie. echo "+----------------------+------+------+" for temporada in */; do # Si no hay directorio de temporada, no cambiamos de directorio. if [[ -d "$temporada" ]]; then cd "$temporada" fi # Imprimir nombre de directorio donde estamos. printf "| %-34s |\n" "$temporada" # Comenzar recuadro para archivos de temporada echo "+----------------------+------+------+" for archivo in *; do # Solo imprimir archivos mp4 y mkv (ignorar imágenes y otros archivos) if [[ $archivo == *.mp4 || $archivo == *.mkv ]]; then printf "| %-20s |" "$archivo" imprimirImageSize "$archivo" printf "\n" fi done echo "+----------------------+------+------+" # Regresar al directorio inicial para poder cambiar al siguiente. cd .. done
Lo que me da algo como la tabla siguiente:
+----------------------+------+------+ | */ | +----------------------+------+------+ | E0001.mp4 | 1280 | 720 | | E0002.mp4 | 1280 | 720 | | E0003.mp4 | 1280 | 720 | | E0004.mp4 | 1280 | 720 | | E0005.mp4 | 1280 | 720 | | E0006.mp4 | 1280 | 720 | | E0007.mp4 | 1280 | 720 | | E0008.mp4 | 1280 | 720 | | E0009.mp4 | 1280 | 720 | | E0010.mp4 | 1280 | 720 | | E0011.mp4 | 1280 | 720 | | E0012.mp4 | 1280 | 720 | | E0013.mp4 | 1280 | 720 |