80 lines
2.8 KiB
Bash
80 lines
2.8 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# --- CONFIGURATION ---
|
|
CACHE_DIR="./cache_video_tmp"
|
|
OUTPUT_FILE="video_scroll_finale.mp4"
|
|
WIDTH=1080 # Largeur de la vidéo (Standard Portrait)
|
|
HEIGHT=1920 # Hauteur de la fenêtre vidéo
|
|
SEC_PER_SLIDE=15 # Temps de défilement par slide (moyenne)
|
|
|
|
# --- NETTOYAGE PRÉALABLE ---
|
|
# On nettoie le cache s'il existe déjà pour éviter les mélanges
|
|
if [ -d "$CACHE_DIR" ]; then
|
|
echo "🧹 Nettoyage de l'ancien cache..."
|
|
rm -rf "$CACHE_DIR"
|
|
fi
|
|
mkdir -p "$CACHE_DIR"
|
|
|
|
echo "📂 Début du traitement des PDF..."
|
|
|
|
# --- 1. CONVERSION PDF -> IMAGES ---
|
|
# On utilise un compteur global pour que les images de plusieurs PDFs se suivent
|
|
counter=1000 # On commence à 1000 pour éviter les problèmes de tri (1, 10, 2)
|
|
|
|
for pdf in *.pdf; do
|
|
if [ -f "$pdf" ]; then
|
|
echo " -> Traitement de : $pdf"
|
|
# Extraction en PNG (haute qualité)
|
|
# -r 150 suffit car on va redimensionner à 1080px de large après
|
|
pdftoppm -png -r 150 "$pdf" "$CACHE_DIR/temp_slide"
|
|
|
|
# Renommage séquentiel pour garantir l'ordre
|
|
for img in "$CACHE_DIR"/temp_slide-*.png; do
|
|
mv "$img" "$CACHE_DIR/slide_${counter}.png"
|
|
((counter++))
|
|
done
|
|
else
|
|
echo "❌ Aucun fichier PDF trouvé."
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# --- 2. REDIMENSIONNEMENT ---
|
|
echo "📐 Redimensionnement des images à ${WIDTH}px de large..."
|
|
# On redimensionne tout de suite pour éviter de faire exploser la RAM lors de l'assemblage
|
|
mogrify -resize "${WIDTH}x" "$CACHE_DIR"/*.png
|
|
|
|
# --- 3. ASSEMBLAGE VERTICAL ---
|
|
echo "puzzle Assemblage de la bande verticale géante..."
|
|
# On colle toutes les images verticalement (-append)
|
|
convert "$CACHE_DIR"/*.png -append "$CACHE_DIR/grande_bande.png"
|
|
|
|
# --- 4. CALCULS DE DURÉE ---
|
|
# On compte le nombre d'images générées
|
|
num_slides=$(ls "$CACHE_DIR"/slide_*.png | wc -l)
|
|
duration=$(echo "$num_slides * $SEC_PER_SLIDE" | bc)
|
|
|
|
echo "⏱️ Nombre de slides : $num_slides"
|
|
echo "⏱️ Durée totale estimée : $duration secondes"
|
|
|
|
# --- 5. ENCODAGE VIDÉO SCROLL (FFMPEG) ---
|
|
echo "🎥 Génération de la vidéo (patience...)"
|
|
|
|
# Explication de la commande complexe :
|
|
# - loop 1 : Boucle sur l'image pour en faire un flux
|
|
# - crop : Découpe une fenêtre de 1080x1920
|
|
# - y='(ih-oh)*t/duration' : La position Y avance proportionnellement au temps
|
|
# - format=yuv420p : Indispensable pour la compatibilité Android/Lenovo
|
|
|
|
ffmpeg -v error -stats \
|
|
-loop 1 -i "$CACHE_DIR/grande_bande.png" \
|
|
-vf "crop=${WIDTH}:${HEIGHT}:0:'(ih-oh)*t/${duration}',format=yuv420p" \
|
|
-t "$duration" \
|
|
-c:v libx264 -preset fast -crf 23 \
|
|
-r 30 \
|
|
"$OUTPUT_FILE"
|
|
|
|
echo ""
|
|
echo "✅ Terminé ! Le fichier est ici : $OUTPUT_FILE"
|
|
echo "💡 Le dossier '$CACHE_DIR' contient encore les images, tu peux le supprimer si la vidéo est OK."
|