Table des matières

Générer un "sprite" depuis une vidéo

Source – Source

La génération d'un sprite se fait selon les étapes suivantes :

  1. Récupération de la durée de la vidéo,
  2. Calcul du nombre d'images par seconde,
  3. 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

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>

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
}
1)
Cela ne sert qu'à supprimer l'avertissement lors de l'exécution, l'image est générée correctement même sans l'utilisation de cette option. Pour plus d'information, voir ici
2)
0 est la meilleure qualité