Skip to content

Instantly share code, notes, and snippets.

@zas
Created May 29, 2015 21:16
Show Gist options
  • Save zas/b4a7c81e2993cba3768e to your computer and use it in GitHub Desktop.
Save zas/b4a7c81e2993cba3768e to your computer and use it in GitHub Desktop.
#!/bin/bash
# Génère un script qui copie les images source autant de fois que nécessaire,
# respectant la structure (ordre des répertoires et des fichiers),
# pour créer une vidéo image par image
# ensuite convertit les images en vidéo
# Note: ce script génére un script
# donc faire:
# $ . generate.sh > copyall.sh
#
# vérifier les commandes générées:
# less copyall.sh
#
# éxécutez:
# . copyall.sh
# STRUCTURE DES REPS
# .
# ├── images_finales
# │   ├── montage
# │   │   ├── 01_blanc
# │   │   │   ├── 7up.png
# │   │   │   ├── actimel.png
# │   │   │   ├── alsa.png
# │   │   │   ├── balisto.png
# │   │   │   ├── benetjerry.png
# │   │   │   ├── ...
# │   │   │   ├── tropicana.png
# │   │   │   ├── twinings.png
# │   │   │   ├── twix.png
# │   │   │   ├── vico.png
# │   │   │   └── yop.png
# │   │   ├── 02_jaune
# │   │   │   ├── 001_mazola.png
# │   │   │   └── icetea.png
# │   │   ├── 03_orange
# │   │   │   ├── krema.png
# │   │   │   └── unclesbens.png
# │   │   ├── 04_rouge
# │   │   │   ├── 001_kitkat.png
# │   │   │   ├── 002_malteses.png
# │   │   │   ├── 003_macdo.png
# │   │   │   ├── 004_pringles.png
# │   │   │   └── cocacola.png
# │   │   ├── 05_marron
# │   │   │   ├── chokolate.png
# │   │   │   ├── cocopops.png
# │   │   │   └── lion.png
# │   │   ├── 06_bleu
# │   │   │   ├── 004_knorr.png
# │   │   │   ├── 005_crunch.png
# │   │   │   ├── 006_smarties.png
# │   │   │   ├── 007_poulain.png
# │   │   │   ├── 008_prince.png
# │   │   │   ├── 009_milkyway.png
# │   │   │   └── 010_frosties.png
# │   │   ├── 07_noir
# │   │   │   ├── mars.png
# │   │   │   └── nesafé.png
# │   │   ├── copyall.sh
# │   │   ├── generate_commented.sh <--- vous etes ici
# │   │   ├── generate.sh
# │   │   ├── genvid.sh
# │   │   ├── The Bloody Beetroots - Rocksteady.ogg
# │   │   └── The Bloody Beetroots - Rocksteady.wav
# │   └── vid
# │   └── output.mp4
# └── images_originales
# run from this script directory ('montage')
# destination des images générées et de la vidéo, ici "vid" dans le répertoire parent
DEST=../vid
# fichier son
SOUNDFILE=The\ Bloody\ Beetroots\ -\ Rocksteady.wav
# nom du fichier video
VIDEOFILE=output.mp4
# nombre d'images de video à générer par image source (12 images à 25 images/s =~ 0.5s)
NUM_PER_IMG_DFT=11
# frames par seconde pour la video
FPS=25
# nombre total de "frames" (images de la vidéo) à générer
MAXFRAMES=$((94*$FPS))
# compteur de frames
export COUNT=0;
# suppression des fichiers issus d'une précédente génération
echo "rm ${DEST}/0*.png"
# nombre de boucles (suffisant pour couvrir le nombre de frames)
# en gros > MAXFRAMES / (nombre de fichiers image source * NUM_PER_IMG_DFT)
NBLOOP=2
for LOOP in $(seq 0 $NBLOOP); do
# recherche les repertoires des images (par couleur)
for DIR in $(find . -maxdepth 1 -mindepth 1 -type d|sort); do
# liste les fichiers dans ce repertoire
for FILE in $(ls -1 $DIR --color=none|sort); do
COUNT=$(($COUNT+1));
if [ $COUNT -gt $MAXFRAMES ] ; then
# on a depasse le nombre de frames requis, on stoppe
break 3
fi
#conversion des images source vers un fichier png
#ici les fichiers source ont tous la bonne taille, pas besoin
#de redimmensionner
# voir convert (ImageMagick)
CONVERTED="$DEST/$(printf "%06d.png" $COUNT)";
echo convert $DIR/"$FILE" -flatten +matte "$CONVERTED";
NUM_PER_IMG=$NUM_PER_IMG_DFT
# exemple de "ralentissement"" entre la frame 100 et 200
#if [ $COUNT -gt 100 ] && [ $COUNT -le 200 ]; then
# NUM_PER_IMG=25
#fi
for i in $(seq 1 $NUM_PER_IMG); do
COUNT=$(($COUNT+1));
if [ $COUNT -gt $MAXFRAMES ] ; then
# on a depasse le nombre de frames requis, on stoppe
break 4
fi
# on cree un lien symbolique pour multiplier les images identiques
echo ln -s "$CONVERTED" "$DEST/$(printf "%06d.png" $COUNT)";
# si les liens symboliques ne sont pas supportes, on fait des copies:
# par exemple:
# echo cp "$CONVERTED" "$DEST/$(printf "%06d.png" $COUNT)";
done;
done;
done;
done
# generation de la video à partir de l'ensemble des images fixes
# on prend tous les fichiers xxxxxx.png (x=[0-9])
# et aussi le fichier son
# on utilise "avconv" ici (https://libav.org) mais ffmpeg fonctionne aussi (http://www.ffmpeg.org)
echo "avconv -i '$DEST/%06d.png' -i '$SOUNDFILE' -threads 4 -s 1280x720 -vcodec mpeg4 -acodec libvo_aacenc -b 20000k -r $FPS -y '$DEST/$VIDEOFILE'"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment