#!/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."