Diaporama avec effet de zoom et rotation

On continue de s’amuser avec ffmpeg…

On peut appliquer différents effets de rotation à chaque image, les combiner ou pas.

Les images jpeg , et le fichier son.mp3 sont par exemple dans un dossier Images/vogue

Le script est dans un fichier diapozoom.sh

Utilisation

bash diapozoom.sh vogue smart ‘Défilé Mode’ ‘Hiver 2021’ son.mp3

#!/bin/bash
#set -x
# pas de prise en compte des messages d'erreur
exec 2>/dev/null
echo "Donner 1) le nom du sous-dossier d'images"
echo "Donner 2) le type: pc ou smart "
echo "Donner 3) le titre de début"
echo "Donner 4) le titre de fin"
echo "Donner 5) le nom du fichier son"
echo " Exemple: diapozoom fatim smart 'Fatim Diabaté' 'La Haute Gamme' son.mp3"
titre=$3
fin=$4
if [ -z "$1" ]
then
	echo "Nom du sous-dossier d'images ?"
	exit
fi
if [ -z "$2" ]
then
	echo "Type: pc ou smart ?"
	exit
fi
PWD=/home/$USER/Images
PWD=$PWD/$1
cd "$PWD"
pwd
nb=1
nb2=1
size=1600x900
hauteur=900
largeur=1600
#
if [ $2 = "smart" ];
then
# résolution largeur x hauteur 1080x1920 pour smartphone  scale=w=480:h=1064
	#size=1080x1920
	#largeur=1080
        #hauteur=1920
        size=480x1064
	largeur=480
        hauteur=1064
#
fi
echo "résolution" $size
date
#
if [ $2 = "smart" ]; #cas smart
then
# IL FAUT TESTER LA PROPORTION 1080/1920=0,56
#
for file in "$PWD"/*.jpg
do
# test de la taille des photos
# largeur
largeurin=$(identify -format  '%w' "$file") 2>/dev/null
RESULT=$?
if [ $RESULT == 0 ]; #res
then
hauteurin=$(identify -format  '%h' "$file") 2>/dev/null
prop=$(("$largeurin"/"$hauteurin"))
if  (($prop < 1));
  then	
#                                        on garde
  convert "$file" -normalize -type TrueColor "$PWD"/"$nb2".ppm 2>/dev/null
#  echo "création de "$PWD"/"$nb2".ppm"
  nb2=$(($nb2 + 1))
  fi
nb=$(($nb + 1))
fi #res
done
#
for file in "$PWD"/*.png
do
# test de la taille des photos
# largeur
largeurin=$(identify -format  '%w' "$file") 2>/dev/null
RESULT=$?
if [ $RESULT == 0 ]; #res
then
hauteurin=$(identify -format  '%h' "$file") 2>/dev/null
prop=$(("$largeurin"/"$hauteurin"))
if (($prop < 1)); #2
  then	
#                                        on garde
  convert "$file" -normalize -type TrueColor "$PWD"/"$nb2".ppm 2>/dev/null
#  echo "création de "$PWD"/"$nb2".ppm"
  nb2=$(($nb2 + 1))
  fi # 2	
nb=$(($nb + 1))
fi #res
done
else
# IL FAUT TESTER LA PROPORTION cas PC 1600/900=1,77
#echo $PWD
for file in "$PWD"/*.jpg
do
# test de la taille des photos
# largeur
largeurin=$(identify -format  '%w' "$file") 2>/dev/null
RESULT=$?
if [ $RESULT == 0 ]; #res
then
hauteurin=$(identify -format  '%h' "$file") 2>/dev/null
prop=$(("$largeurin"/"$hauteurin"))
if  (($prop == 1)); #1
  then	
#                                        on garde
  convert "$file" -normalize -type TrueColor "$PWD"/"$nb2".ppm 2>/dev/null
#  echo "création de "$PWD"/"$nb2".ppm"
  nb2=$(($nb2 + 1))
  fi # 1
nb=$(($nb + 1))
fi #res
done
#
for file in "$PWD"/*.png
do
# test de la taille des photos
# largeur
largeurin=$(identify -format  '%w' "$file") 2>/dev/null
RESULT=$?
if [ $RESULT == 0 ]; #res
then
hauteurin=$(identify -format  '%h' "$file") 2>/dev/null
prop=$(("$largeurin"/"$hauteurin"))
if (($prop == 1)); #2
  then	
#                                        on garde
  convert "$file" -normalize -type TrueColor "$PWD"/"$nb2".ppm 2>/dev/null
#  echo "création de "$PWD"/"$nb2".ppm"
  nb2=$(($nb2 + 1))
  fi # 2	
nb=$(($nb + 1))
fi #res
done
fi # cas smart
/usr/bin/sleep 2
#creation  de la photo0 et duplication en derniere photo
convert -background black -fill white -font Times-Roman -pointsize 128 -size $size -gravity Center caption:"

$titre


" 0.ppm
#echo "création photo debut"
#
convert -background black -fill white -font Times-Roman -pointsize 128 -size $size -gravity Center caption:"

$fin

 " "$PWD"/"$nb2".ppm
#echo "création de photo fin" "$nb2"
nb2=$(($nb2 - 1))
echo "$nb2" " photos prises en compte"
#
# horodatage du nom de fichier mp4
quand=$(date +%d-%m-%y)-$(date +%H-%M-%S)
nom="$PWD"/$titre-$size-du-$quand
#
#echo "*********************************************************************************"
################################################
# La grosse boucle
################################################
ls *.ppm >> listeppm
sort -n listeppm >> listordon
#cat listordon
#
for line in $(cat listordon)
do
#
# entête de commande
FULL_SCRIPT="ffmpeg -hide_banner -loglevel error -y -i $line "
#
# filtre pour zoomer durée pour chaque image 5*25= 3 secondes
FULL_SCRIPT+=" -filter_complex zoompan=z='zoom+0.002':d=5*25:s=$size "
#
# ajout des options pour la fin de commande 
# on travaille en ts pour pouvoir concaténer
#
FULL_SCRIPT+=" -codec:v libx264 -pix_fmt yuv420p -profile:v baseline -tune stillimage $line.ts "
#
#echo $FULL_SCRIPT
$FULL_SCRIPT
# concatenation
cat "$line.ts" >> "$nom.ts"
#
#echo "*********************************************************************************"
done
#
echo $nom.3gp en cours
#ffmpeg -hide_banner -loglevel error -y -i "$nom.ts" -codec:v libx264 -pix_fmt yuv420p -profile:v baseline "$nom.mp4"
#ffmpeg -hide_banner -loglevel error -y -i "$nom.ts" -codec:v libx264 "$nom.mp4"
#ffmpeg -hide_banner -loglevel error -y -i "$nom.ts" -codec:v libx265 "$nom.mp4"
# proportion de mon smartphone photo plein écran 2304*5120=2,22
# 480*2,22=1064
#ffmpeg -hide_banner -loglevel error -y -i "$nom.ts" -vcodec libx264 -r 25 -b:v 128k -filter:v scale=w=480:h=1064 -profile:v main "$nom.3gp"
ffmpeg -hide_banner -loglevel error -y -i "$nom.ts" -vcodec libx264 -r 25 -b:v 128k -filter:v scale=w=$largeur:h=$hauteur -profile:v main "$nom.3gp"
echo "*********************************************************************************"
#
date
echo $nom.3gp créé
#rm "$nom.ts"
rm "$PWD"/*.ppm
rm "$PWD"/*ppm.ts
rm listeppm
rm listordon
notify-send --icon=dialog-information " Diaporama créé"
#ffprobe -hide_banner $nom.mp4
if [ -z "$5" ];
then
echo "Pas de fichier son"
	exit
else
nomson=$PWD/$5
#ffmpeg -hide_banner -loglevel error -i $nomson -i $nom.mp4 -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3.0 -crf 10 -acodec aac -shortest  $nom-avec-son.mp4
#FULL_MP4="ffmpeg -hide_banner -i $nomson -i $nom.mp4 -vcodec libx265 -acodec aac -shortest  $nom-avec-son.mp4"
#FULL_MP4="ffmpeg -i "$nom.mp4" -i "$nomson" -c:v copy -c:a aac "$nom-avec-son.mp4" "
#echo $FULL_MP4
ffmpeg -i "$nom".3gp -i "$nomson" -c:v copy -c:a aac -b:a 64k "$nom"-avec-son.3gp
#echo $nom-avec-son.mp4 en cours
#$FULL_MP4
echo $nom-avec-son.3gp creé
#ffprobe -hide_banner $nom-avec-son.mp4
notify-send --icon=dialog-information " son ajouté"
fi

Par Bidouille De Bian

Bidouilleur sur Linux Debian 10 (Buster). Débutant dans le blog sur Wordpress.