Revisando resolución de videos en bash

Publicado: 2023-02-05

Ahora 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 |

¿Tienes algún comentario?

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *