Outils pour utilisateurs

Outils du site


informatique:ffmpeg:generer_un_sprite_depuis_une_video

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
  • scale=8 permet de définir la précision (nombre de chiffres après la virgule),
  • bc permet 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>
  • -y permet 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 1 permet de ne générer qu'une seule image à partir de la vidéo,
  • -update 1 permet d'indiquer que le nom de fichier de sortie ne contient pas de gabarit de séquence d'image 1),
  • -q:v 2 permet de gérer la qualité de la vidéo 2),
  • -filter_complex permet 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)/2 permet 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=decrease permet 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
}
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é
informatique/ffmpeg/generer_un_sprite_depuis_une_video.txt · Dernière modification : de alexis