informatique:ffmpeg:generer_un_sprite_depuis_une_video
Table des matières
Générer un "sprite" depuis une vidéo
La génération d'un sprite se fait selon les étapes suivantes :
- Récupération de la durée de la vidéo,
- Calcul du nombre d'images par seconde,
- Génération du sprite.
Récupération de la durée de la vidéo
On va faire la même chose qu'ici à l'exception que nous allons garder la durée en seconde sans la convertir en base 60. Ce qui donne la commande suivante :
ffprobe -v error -show_entries format=duration -output_format default=noprint_wrappers=1:nokey=1 <input.mp4>
Pour le détail des options, voir la page mentionnée un peu plus haut.
Calcul du nombre d'images par seconde
echo "scale=8; <nb_frames> / <duration>" | bc
scale=8permet de définir la précision (nombre de chiffres après la virgule),bcpermet d'interpréter la chaîne de caractère et d'en effectuer le calcul.
Génération du "sprite"
ffmpeg -y -i <input> -frames:v 1 -update 1 -q:v 2 -filter_complex "fps=<fps>,pad=width=max(iw\,ih*(16/9)):height=ow/(16/9):x=(ow-iw)/2:y=(oh-ih)/2,scale=-1:135:force_original_aspect_ratio=decrease,tile=<width>x<height>" <output>
-ypermet d'écrire dans le fichier de sortie même s'il existe déjà,-i <input>permet de sélectionner la vidéo à traiter,-frames:v 1permet de ne générer qu'une seule image à partir de la vidéo,-update 1permet d'indiquer que le nom de fichier de sortie ne contient pas de gabarit de séquence d'image 1),-q:v 2permet de gérer la qualité de la vidéo 2),-filter_complexpermet de générer le sprite,fps=<fps>permet de définir le nombre d'images par seconde pour obtenir exactement le nombre d'image voulu,pad=width=max(iw\,ih*(16/9)):height=ow/(16/9):x=(ow-iw)/2:y=(oh-ih)/2permet de définir le ratio de l'image en 16:9 et de centrer l'image à l'intérieur de celui-ci,scale=-1:135:force_original_aspect_ratio=decreasepermet de diminuer la taille des images générées,tile=<width>x<height>permet de définir la taille de la grille d'image.
Lier les différents morceaux dans une fonction
# Extract sprite from video function video-sprite { if [ "$1" == "" ]; then echo Missing video file name return fi WIDTH=${2:-8} HEIGHT=${3:-8} FRAMES=$(echo "$WIDTH * $HEIGHT" | bc) DURATION=$(ffprobe -v error -show_entries format=duration -output_format default=noprint_wrappers=1:nokey=1 -i "$1") FPS=$(echo "scale=8; $FRAMES / $DURATION" | bc) ffmpeg -y -i "$1" -frames:v 1 -update 1 -q:v 2 -filter_complex "fps=$FPS,pad=width=max(iw\,ih*(16/9)):height=ow/(16/9):x=(ow-iw)/2:y=(oh-ih)/2,scale=-1:135:force_original_aspect_ratio=decrease,tile="$WIDTH"x"$HEIGHT "$1".jpg }
informatique/ffmpeg/generer_un_sprite_depuis_une_video.txt · Dernière modification : de alexis
