Création de diaporama avec ffmpeg

Un script simple si on ne veut pas sortir l’artillerie lourde genre kdenlive…

Ce script crée temporairement des images adaptées avec les images du répertoire courant et génère une vidéo mp4 avec affichage de chaque image pendant 5 secondes.

Premier paramètre: le nom du sous-dossier d’images dans votre répertoire principal Images.

Deuxième paramètre: l’orientation pc ou smart

  • smart La résolution est adaptée pour que le diaporama soit regardé sur un smartphone en position vertical.
  • pc La résolution est adaptée pour que le diaporama soit regardé sur un PC avec écran large

Troisième paramètre (facultatif): le nom du fichier son. Le fichier son est dans le même sous-dossier que les images

Script de création de diaporama

Les paramètres utilisés pour une vidéo lisible par Android: -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3.0 -crf 10 -preset slower -tune film sont adaptables selon votre maitrise de ffmpeg.

#!/bin/bash
#set -x
echo "Donner le nom du sous-dossier d'images et le type pc ou smart et le nom du fichier son"
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
	size=1080x1920
	largeur=1080
        hauteur=1920
#
fi
echo "résolution" $size
date
#
if [ $2 = "smart" ]; #cas smart
then
# IL FAUT TESTER LA PROPORTION 1080/1920=0,51
#
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"/photo"$nb2".ppm 2>/dev/null
  echo "création de "$PWD"/photo"$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"/photo"$nb2".ppm 2>/dev/null
  echo "création de "$PWD"/photo"$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"/photo"$nb2".ppm 2>/dev/null
  echo "création de "$PWD"/photo"$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"/photo"$nb2".ppm 2>/dev/null
  echo "création de "$PWD"/photo"$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:"Hello" photo0.ppm
echo "création photo debut"
convert -background black -fill white -font Times-Roman -pointsize 128 -size $size -gravity Center caption:"The End" "$PWD"/photo"$nb2".ppm
echo "création de photo fin" "$nb2"
#
# horodatage du nom de fichier mp4
quand=$(date +%d-%m-%y)-$(date +%H-%M-%S)
nom=Diaporama-$size-du-$quand
#
/usr/bin/sleep 2
#exit
#
# 
echo $nom en cours
ffmpeg -hide_banner -loglevel error -framerate 1/5 -f image2 -i "$PWD"/photo%d.ppm -an -r 25 -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3.0 -vf "scale=$size" $nom.mp4
#
date
echo $nom.mp4 créé
rm "$PWD"/photo*.ppm
notify-send --icon=dialog-information " Diaporama créé"
ffprobe -hide_banner $nom.mp4
if [ -z "$3" ];
then
echo "Pas de fichier son"
	exit
else
nomson=$PWD/$3	
echo $nom-avec-son.mp4 en cours
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		
notify-send --icon=dialog-information " son ajouté"
echo $nom-avec-son.mp4 creé
ffprobe -hide_banner $nom.mp4
fi

Usage

Ajouter ce code dans un fichier texte appelé diaporama , dans le répertoire principal Images contenant les sous-dossiers d’images.

Encadrer le nom du sous-répertoire avec des  »  » si le nom contient un espace.

bash diaporama Paris smart

bash diaporama "Naomi Campbell" pc

En savoir plus

Outils utilisés: ffmpeg et imagemagick

https://trac.ffmpeg.org/wiki/Slideshow

https://trac.ffmpeg.org/wiki/Encode/H.264

https://linux.die.net/man/1/convert

https://imagemagick.org/Usage/resize/

http://www.imagemagick.org/www/script/command-line-options.php#density

Ajouter du son dans le diaporama

ffmpeg -i son.mp3 -i diaporama.mp4 -vcodec copy -acodec aac -t 00:01:30.00 diaposon.mp4

La durée t est celle du fichier diaporama.mp4

Script avec ajout de son dans le diaporama

Mettre un fichier son, exemple capture.mp3 dans le même sous-dossier que les photos

Donner son nom en 3ième paramètre

bash diaporama janvier/2020 pc capture.mp3

Par Bidouille De Bian

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