Files
2026-01-07 18:51:07 +01:00

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."