Un sitio para guardar lo que veo, hago, y lo que quisiera ver, hacer y aprender.

Listo! MySlideShow

Terminado. Funcionando perfectamente. Tiene 7 efectos: zoom out central, desde cada una de las esquinas (parecido a pan&zoom) y rotacion en el sentido y contra el sentido del reloj. Añade automáticamente las pistas de audio, si es más de un tema, hace un cross-fade entre las canciones. Es bastante rápido en su ejecución, y no pone límite en la cantidad de imágenes a procesar, todo depende de la capacidad en el disco para almacenamiento intermedio, claro que todo queda limpio al terminar.

Estos son algunos trozos del código:
Este es una funcion del efecto zoom-out desde la esquina inferior derecha. El resto es muy parecido, básicamente lo mismo, pero en el zoom-out central uso la propiedad -gravity center con los factores de recorte, sin indicar posiciones absolutas.

function pan-zoom-out-br {
echo "Procesando imagen $1 con efecto pan-zoom-out-br"
idx=001
factor=25
res=1
XSize=$(identify -format "%w" "$1")
YSize=$(identify -format "%h" "$1")
while [ "$res" -eq 1 ]
do
Xval=$(echo "$XSize-($XSize*$factor/100)" | bc)
Yval=$(echo "$YSize-($YSize*$factor/100)" | bc)
convert "$1" -crop "$factor"%x"$factor"%+"$Xval"+"$Yval" -resize 1290x730 ../videos/"$idx.jpg"
((++idx))
factor=$(bc<<<"scale=2;$factor+0.5")
res=$(echo "$factor < 100.0" | bc)
done
}

Este es el código para la rotación. Uso un archivo intermedio “png” porque conserva la transparecia de modo de poder colocar detrás la imagen original, pero borrosa.

function rotar-clock {
echo "Procesando imagen $1 con efecto rotar clockwise"
idx=001
angle="-150"
convert "$1" -gaussian-blur 20,20 ../videos/fondo.jpg
while [ "$angle" -lt 0 ]
do
convert "$1" -matte -virtual-pixel transparent -distort SRT "$angle" +repage ../videos/rotado.png 2>/dev/null
composite -gravity center ../videos/rotado.png ../videos/fondo.jpg ../videos/"$idx.jpg"
((++idx))
((++angle))
done
rm ../videos/rotado.png ../videos/fondo.jpg
}

Este es el código que uso para crear el audio con crossfae:

function crear-audio {
echo "Procesando archivos de audio"
idx=1
#Quitamos el silencio al inicio y al final de cada archivo
for audios in *.mp3 *.MP3
do
sox "$audios" audio/"$idx.mp3" silence 1 0.1 0.1% reverse silence 1 0.1 0.1% reverse 2>/dev/null
((++idx))
done
#Movemos el primer archivo
mv audio/1.mp3 zaudio.mp3
#Unimos los archivos de audio con cross-fade
for archivo in audio/*.mp3
do
echo "Procesando archivo de audio $archivo"
sox zaudio.mp3 "$archivo" temp.mp3 splice -q $(soxi -D zaudio.mp3),4
rm zaudio.mp3
mv temp.mp3 zaudio.mp3
done
}

Finalmente el proceso de selección al azar del efecto para cada imagen y la creación del video (temporal) respectivo. Al término de procesar todas las imágenes, se unen los video (es fácil con mpg’s solo hay que hacer un cat videos*.mpg > video-final.mpg y listo) y se reencodean junto con la música en el video definitivo.

for archivo in *.jpg *.JPG
do
echo "Procesando imagen $imagenes de $total"
((--imagenes))
#Usamos un sistema al azar para elegir que efecto aplicar (tenemos 5)
tipo=$(( $RANDOM % 7 + 1))
case $tipo in
1)
zoom-out-center "$archivo"
;;
2)
pan-zoom-out-tl "$archivo"
;;
3)
pan-zoom-out-tr "$archivo"
;;
4)
pan-zoom-out-br "$archivo"
;;
5)
pan-zoom-out-bl "$archivo"
;;
6)
rotar-clock "$archivo"
;;
7)
rotar-counterclock "$archivo"
;;
esac
mogrify -crop 1280x720+10 ../videos/*.jpg
echo "Creando el video"
ffmpeg -y -i ../videos/"%d.jpg" -r 29.97 -s hd720 ../videos/"zoom.$archivo.mpg" >/dev/null 2>&1
echo "Borrando imagenes temporales"
rm ../videos/*.jpg
done

Dos cosas (por ahora) que me gustaria que tuviese: una forma de ir mostrando el progreso al estilo “Barra de Progreso” (sic), crear una introducción con texto y una imagen de fondo, y un cierre con el nombre del artista que hizo el o los temas musicales. Al final fueron tres cosas.