Ahora que sabemos editar un vídeo a partir de una secuencia de fotogramas con ffmpeg nos encontramos con que para poder hacerlo, los fotogramas han de estar numerados correlativamente y todos con el mismo número de dígitos en el numeral para que los ordene bien en el vídeo, lo cual es sencillo, pero si lo automatizamos, mejor.
Aquí os dejo la función que utilizo para ello:
function devuelvefotograma()
{
# Función que recibe el numeral del último fotograma creado y devuelve el fotograma a utilizar como imagen destino por convert
esentero='^[0-9]+$'
numerofotograma=$1
if [ -z $numerofotograma ] || ! [[ $numerofotograma =~ $esentero ]]
then
let numerofotograma=1
fi
if [ $numerofotograma -lt 10 ]
then
fotograma="fotograma000"$numerofotograma".png"
elif [ $numerofotograma -ge 10 ] && [ $numerofotograma -lt 100 ]
then
fotograma="fotograma00"$numerofotograma".png"
elif [ $numerofotograma -ge 100 ] && [ $numerofotograma -lt 1000 ]
then
fotograma="fotograma0"$numerofotograma".png"
else
fotograma="fotograma"$numerofotograma".png"
fi
echo $fotograma;
}
Explicación de la función
Primero defino la función y le llamo devuelvefotograma, ya que me gusta que el nombre de una función sea descriptivo, así que suelo usar un imperativo que indique lo que quiero que haga.
Una descripción de qué va a hacer la función.
Y comienzo la función diciéndole que $numerofotograma (también un nombre que deje claro qué va a almacenar esa variable) tome el valor de $1, es decir, del primer parámetro que le pasamos a la función. Y no es que no me guste usar el nombre de la variable $1, sino que $1 es genérico para todas las funciones y $numerofotograma es más sencillo de entender (sí, hay que teclear un poco más, pero a la hora de mantener un script es mejor si el nombre de las variables indican qué contienen. Y si tienes configurado en tu editor de textos que al pulsar tabulador complete los nombres de las funciones, tampoco tienes que teclear mucho más).
Le indico también que la variable $esentero sea una expresión regular que diga que desde el comienzo hasta el final sean números ('^[0-9]+$').
Compruebo si no tiene contenido en la variable ([ -z $numerofotograma ]) o (||) no es numérico (! [[ $numerofotograma =~ $esentero ]]) y si no tiene nada la variable o no es numérica, le soy el valor 1. Ya sé que puede sobreescribir fotogramas al hacerlo así, pero prefiero darle un valor a la variable que me de error la función. A gustos.
Pregunto si $numerofotograma es menor que 10 con [ $numerofotograma -lt 10 ], es decir, si únicamente tiene un carácter. Si es así, le añado tres ceros. Por ejemplo, si el número del fotograma es 1, le digo que sea 0001.
Si es igual o mayor que 10 ([ $numerofotograma -ge 10 ]) y además (&&), es menor que cien ([ $numerofotograma -lt 100 ]) es que tiene dos carácteres, así que le añado dos ceros. Si tiene tres carácteres es que va de 100 a 999, así que le digo que si es igual o mayor que cien y menor que mil, que añada un 0.
Y si es mayor que 1000 es que tiene 4 dígitos o más. Y no añado ningún cero. Alguien podría decir que qué pasa si hay más de 9.999 fotogramas. Sencillamente, que no uso esta función, ya que usaría la opción de codificar el vídeo al vuelo. Esta función la uso para generar y ver los fotogramas antes de renderizar un vídeo. Si un vídeo tiene más de 9.999 fotogramas puede ocupar unos 70 Gb de espacio en disco. Y no voy a visualizar individualmente tantos fotogramas.
La opción de visualizar fotograma a fotograma es para secuencias cortas en las que hay detalles importantes o una muestra para ver cómo quedan los fotogramas antes de hacer el vídeo.
Por último, devuelvo $fotograma.
Variables e invocación de la función
Podemos definir la variable $numerofotograma o no. Si no la inciamos, la función la inicializa a 1. Si la queremos inicializar, por hacer un script más elegante, lo podemos hacer con:
let numerofotograma=1
Invocamos a la función pasándole el número de fotograma como parámetro y nada más saber el fotograma a utilizar, le decimos que le sume 1. Podemos hacerlo más tarde, pero es más fácil que se nos olvide si lo dejamos para después.
fotograma=$(devuelvefotograma $numerofotograma)
let numerofotograma++
Y ya podemos usar la variable fotograma como imagen de destino con convert.
La función en un script
#!/bin/bash
function devuelvefotograma()
{
# Función que recibe el numeral del último fotograma creado y devuelve el fotograma a utilizar como imagen destino por convert
esentero='^[0-9]+$'
numerofotograma=$1
if [ -z $numerofotograma ] || ! [[ $numerofotograma =~ $esentero ]]
then
let numerofotograma=1
fi
if [ $numerofotograma -lt 10 ]
then
fotograma="fotograma000"$numerofotograma".png"
elif [ $numerofotograma -ge 10 ] && [ $numerofotograma -lt 100 ]
then
fotograma="fotograma00"$numerofotograma".png"
elif [ $numerofotograma -ge 100 ] && [ $numerofotograma -lt 1000 ]
then
fotograma="fotograma0"$numerofotograma".png"
else
fotograma="fotograma"$numerofotograma".png"
fi
echo $fotograma;
}
for i in $(seq 1 50)
do
fotograma=$(devuelvefotograma $numerofotograma)
let numerofotograma++
echo "El fotograma es: "$fotograma
done
Este es un script de control, para ver que devuelve bien el nombre del fotograma. Usa cualquier parámetro de convert para generar los fotogramas con las modificaciones que desees.