web-dev-qa-db-fra.com

Comment puis-je créer un GIF de 30 secondes à partir d'une longue vidéo aléatoire?

J'ai des centaines de vidéos dans un dossier pour lequel je veux faire un gif. La durée de chaque vidéo est différente, mais toutes les vidéos durent plus de 30 secondes. Je veux prendre 10 images gif de 3 secondes à partir d'une vidéo au cours de la vidéo. Par exemple, si la vidéo dure 25 minutes, 3 secondes enregistré gif doit être pris toutes les 2,5 minutes (150 secondes).

Les gifs finis doivent également avoir le même nom que la vidéo mais se terminant par .gif toutes les vidéos sont .mp4

Les gifs devraient être 560x340

Ce serait bien de le faire avec une seule commande.

8
Toodarday

Pas:

  1. Obtenez la durée avec ffprobe .
  2. Utilisez la durée comme valeur dans le filtre sélectionner .
  3. Créer un gif .
  4. Script tout.

Exemple de script:

#!/bin/bash
mkdir 30gif
for f in *.mp4; do
  duration=$(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 "$f")
  ffmpeg -i "$f" -filter_complex "[0:v]select='lt(mod(t,${duration}/10),3)',setpts=N/(FRAME_RATE*TB),scale=560:340:force_original_aspect_ratio=decrease,pad=560:340:(ow-iw)/2:(oh-ih)/2,setsar=1,split[v0][v1];[v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" "30gif/${f%.mp4}.gif"
done

Cela répond à vos nombreuses exigences:

  • Sortie GIF 30 secondes comprenant 3 segments de seconde couvrant également la durée d'entrée
  • Taille de sortie 560x340
  • Une commande (ffmpeg)
  • Utiliser un bash pour la boucle afin que vous puissiez convertir automatiquement des centaines de vidéos
  • Le nom de sortie est le même que le nom d'entrée mais avec .mp4 remplacé par .gif
9
llogan