Utilisateur:Juliette
TOOLBENDING 2015-2016
https://juda.hotglue.me/?TOOLBENDING
Exploration de systèmes de tri, de classification et d'assemblage automatisés et semi-automatisés pour du matériel vidéo.
// À LA MACHINE -
Pour un classement de références vidéos, un besoin de survol, génération d'une banque de donnée par le tag.
Recherche d'un programme d'action pour un système automatisé de sélection, de découpe et de réassemblage "logique" de plans vidéo.
1 Séparer les films en images (1s = 26 images) 2 Analyser les images - Plus grande zone de pixels contigus d’une même couleur - Couleur moyenne des pixels - Couleur dont le nombre de pixels est dominant dans l’image 3 Prélever - Si cette configuration dure plus de deux secondes, prélever la séquence sur toute sa longueur 4 Rassembler - Rassembler les fragments par similitude -> Visages/Pixels contigus = même endroit, même échelle -> Couleur moyenne/dominante = même teinte (certaine tolérance) - Rassembler les fragments par évolution -> Couleur moyenne/dominante = teinte de l’arc en ciel -> Visages/Pixels contigus = grandissant, rapetissant, se déplaçant (forme bouge ou évolue) ==
Handbrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs.
Il sera ici utilisé pour réduire le poids des vidéos avant l'analyse par Shotdetect.
[http://johmathe.name/shotdetect.html
]
Shotdetect is a free software (LGPL) which detects shots and scenes from a video. The result produced is a simple XML file containing all the informations about the movie generated.
shotdetect -i myvideo.avi -o output_dir -s 60 -w -v -f -l -m -r
+
-s : set threshold The threshold is the level for shot detection. High will not detect a lot, low will detect a lot of false shots. A good choice is about 60.
-w : generates audio xml information See the generated file for more details
-v : generates video xml informations See the generated file for more details
-f : generates the first image of shots -l : generates the last image of shots -m : generates the thumbnails images -r : generates the real size images
avconv
avconv -i fich01.mkv -vcodec copy -acodec copy -ss 00:05:10 -t 00:15:00 fich02.mkv
+
-vcodec copy : copie du flux video sans encodage -acodec copy : copie du flux audio sans encodage -i : fichier d'origine (suivi du chemin, sinon être positionné là où se trouve le fichier) -ss : position de départ, ici à 5 mn et 10 sec -t : la durée, ici 15 mn fich01 : le fichier original fich02 : le fichier de sortie
// À LA MAIN - CADAVRE EXQUIS
Chaque joueur laisse un ensemble de mot clés (plus ou moins vague, plus ou moins nombreux, etc… au choix), de tags (type de plans, mouvements de caméra, couleurs...) après avoir choisi une séquence, et le joueur suivant doit choisir la séquence suivante en fonction de ce ou ces tags, sans voir la séquence choisir. Il doit alors à son tour attribuer des mots clés à la séquence choisie. Le jeu s’arrête lorsqu’un des joueurs le décide.
1 Télécharger une vidéo Youtube avec youtube-dl 2 Identifier les plans dans la video avec Shotdetect 3 Choisir le plan à extraire (humain) 4 Extraire les images du plans au format GIF 5 Créer le GIF animé avec imagemagick
6 Fusionnr 2 GIFs animés ensemble
[https://doc.ubuntu-fr.org/youtube-dl ] Youtube-dl est un utilitaire de capture de vidéos en ligne depuis le terminal qui supporte Youtube ainsi que d'autres plateformes vidéos.
youtube-dl http://youtube.urldelavideo
Extraire les images du plans au format GIF
- créer un dossier où déposer les gifs
mkdir ffmpeg_dir
- extraire les images
ffmpeg -ss 00:00:02 -i video.mp4 -to 5 -r 5 -vf scale=400:-1 ffmpeg_dir/out%04d.gif
+
ss – start recording at position i – the input video.mp4 to – stop recording at position. (number in seconds or absolute position in the video) vf – filter graph. We use it to scale the generated images to our desired size (scale=width:height). We specified -1 for height, which indicates that the aspect ratio should be maintained, while the width should be 400 pixels. The generated images can be distorted by specifying arbitrary width and height values r – frame rate (frames per second). Higher value = smoother animation but bigger animated gif
[http://www.imagemagick.org/script/index.php
]
Imagemagick is a software suite to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, JPEG-2000, GIF, TIFF, DPX, EXR, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.
Moi je m'en sers juste pour compiler mes images en un Gif animé.
Créer un GIF
convert -delay 1x5 -loop 0 ffmpeg_dir/out*.gif ffmpeg_dir/animation.gif
+
delay – specifies the length of time to pause between images (ie the animation speed). 1×5 indicates 5 frames per second. loop – indicates the number of iterations required. 0 means infinite.
[https://www.lcdf.org/gifsicle/man.html
]
Gifsicle is a command-line tool for creating, editing, and getting information about GIF images and animations.
Regrouper 2 GIFs
gifsicle --crop 370x275 --colors 256 --merge first.gif second.gif -o merged.gif
+
crop : choisir une taille uniforme colors : passer en 256 couleurs merge : regrouper first.gif et second.gif -o : fichier de sortie merge.gif
CODE FINAL MAC
#!/bin/bash # (1) Utilisateur - Choix d’un pseudo # Sécurité pseudo déjà pris # Sécurité caractères spéciaux et espaces non tolérés cd read -p "Choisissez un pseudo : " nomJ SINGLE=Dropbox/Juda/single pass=1 until [ "$pass" = "oui" ] do if [ ! "$nomJ" = "${nomJ//[\’ ]/}" ] then pass=1 echo "Votre pseudo ne peut pas contenir d’espaces." echo "Choisissez un autre pseudo: " read nomJ elif [[ "$nomJ" =~ [^a-zA-Z0-9\ ] ]] then pass=1 echo "Votre pseudo ne peut pas contenir de caractères spéciaux." echo "Choisissez un autre pseudo: " read nomJ elif [ -d "$SINGLE/${nomJ}" ] then pass=1 echo "Ce pseudo est déjà utilisé." echo "Choisissez un autre pseudo :" read nomJ else pass=oui fi done # Création de dossier joueur DJ # Création d’un fichier nom du joueur nomJ cd cd $SINGLE mkdir $nomJ echo "" echo "Bienvenue $nomJ !" cd $nomJ touch nomJ.txt echo "$nomJ" >> nomJ.txt # (2) Recherche d’un partenaire # Système de pollinisation : un joueur doit trouver un partenaire pour passer du dossier ‘single’ au dossier ‘paired’ et commencer le jeu. Si il n’a pas déjà été ‘fécondé’, un joueur dépose son nom dans le dossier d’un autre joueur pour le réserver. echo "" echo "Aucun autre joueur n'est disponible pour l’instant. Veuillez patientez..." # Sommeil d’un nombre de secondes aléatoire (prévenir une action simultanée à cause de la latence de Dropbox) # Si au réveil, le dossier du joueur a été pollinisé, alors on identifie son partenaire. # Sinon, sélection d’un dossier au hasard (celui dédié au joueur exclus) que le joueur va féconder en y déposant un fichier qui contient son nom (nomP.txt), et y récupérer le nom de son partenaire. cd cd Dropbox/Juda/single folder=aasource while [ ! "$match" = 1 ] do cd cd Dropbox/Juda/single sleeptime=$[RANDOM%7+1] sleep "$sleeptime" folder=`ls | gshuf -n 1` cd if [ -f "$SINGLE/$nomJ/nomP.txt" ] then match=1 elif [ ! -f "$SINGLE/$folder/nomP.txt" ] && [ ! "$SINGLE/$folder" = "$SINGLE/$nomJ" ] then match=1 fi done cd if [ -f "$SINGLE/$nomJ/nomP.txt" ] then cd "$SINGLE/$nomJ" nomP=$(cat nomP.txt) echo "" echo "Vous jouez avec $nomP." else cd "$SINGLE/$folder" touch nomP.txt echo "$nomJ" >> nomP.txt nomP=$(cat nomJ.txt) cd cd "$SINGLE/$nomJ" touch nomP.txt echo "$nomP" >> nomP.txt echo "" echo "Vous jouez avec $nomP." fi # (3) Migrer du dossier ‘single’ au dossier ‘paired’ # Nettoyer après soi - Chacun se charge de supprimer son dossier personnel de ’single’ cd cd $SINGLE rm -r "$nomJ" # Sommeil aléatoire pour empêcher la simultanéité des actions suivantes sleeptime=$[RANDOM%10+1] # Construire un dossier commun - Premier arrivé, premier servant # Le premier joueur qui s’aperçoit qu’il n’y a pas de dossier commun est responsable # Si responsable = création du dossier commun + sous-dossiers (un pour chaque joueur + un pour le gif final) + variables chemins d’accès # Si pas responsable = variables chemins d’accès uniquement cd cd Dropbox/Juda/paired if [ ! -d "$nomP$nomJ" ] then mkdir $nomJ$nomP cd DJP="Dropbox/Juda/paired/$nomJ$nomP" cd $DJP ls mkdir stock mkdir $nomJ mkdir $nomP DJ="$DJP/$nomJ" DP="$DJP/$nomP" DGIF="$DJP/stock" elif [ -d "$nomP$nomJ" ] then cd DJP="Dropbox/Juda/paired/$nomP$nomJ" DJ="$DJP/$nomJ" until [ -d "$DJ" ] do echo waiting sleep 1 done DP="$DJP/$nomP" DGIF="$DJP/stock" fi # Chacun crée l’architecture de son propre dossier (‘copy’ + ‘download’) # Création des fichiers temporaires qui serviront aux échanges d’images cd cd $DJ mkdir download mkdir copy DLJ="$DJ/download" CPJ="$DJ/copy" CPP="$DP/copy" cd cd $CPJ touch temp.txt cd cd $DLJ touch temp.txt # (4) Déterminer le joueur qui commence la partie # Lecture de la date de naissance + création du fichier # Sécurité - seuls les chiffres sont autorisés echo "" dateJ=noneyet until [ "${dateJ//[0-9]}" = "" ] do read -p "$nomJ, entrez ici votre date de naissance (AAAAMMJJ) : " dateJ done cd cd "$DJ" touch dateJ.txt echo "$dateJ" >> dateJ.txt # Attente de la récupération de la date du partenaire echo "" echo "Nous attendons après votre partenaire..." cd while [ ! -f ${DP}/dateJ.txt ]; do sleep 1; done cd $DP dateP=$(cat dateJ.txt) echo "" # Détermination du premier joueur + information if [ ${dateP} -gt ${dateJ} ]; then echo "$nomJ, vous êtes le/la plus vieux/vieille, c'est votre partenaire qui commence." else echo "$nomJ, vous êtes le/la plus jeune, c’est à vous de commencer ! " fi # (5) Choisir un thème pour la partie # Plus jeune : proposition de 3 thèmes choisis aléatoirement parmi une banque de sujets # Choix sécurisé - nécessité de choisir l’un des trois prompt avec le chiffre correspondant # + petite tirade explicative sur le jeu qui va suivre if [ ${dateJ} -gt ${dateP} ]; then cd cd Dropbox/Juda/ressources prompt1=$(gshuf -n 1 prompts.txt) prompt2=$(gshuf -n 1 prompts.txt) prompt3=$(gshuf -n 1 prompts.txt) until [ "$chosenprompt" = 1 ] || [ "$chosenprompt" = 2 ] || [ "$chosenprompt" = 3 ]; do echo "" echo "Choisissez le thème de la partie :" echo "Tapez [1] pour : $prompt1" echo "Tapez [2] pour : $prompt2" echo "Tapez [3] pour : $prompt3" read chosenprompt done fi if [ "$chosenprompt" = 1 ] && [ $dateJ -gt $dateP ] then echo "" echo "Vous avez choisi de jouer une partie sur le thème de :" echo "" echo "$prompt1." cd cd $DJ touch prompt.txt echo "$prompt1" >> prompt.txt echo "" echo "Vous allez à présent échanger des images avec votre partenaire afin de construire" echo "un court récit sur ce thème. À tour de rôle, vous choisirez une image qui sera" echo "transmise à votre partenaire. Chaque fois que vous recevrez une image, vous aurez" echo "le choix de mettre fin à l'échange ou de le poursuivre en ajoutant une nouvelle" echo "image. Au terme de la partie, ces images seront compilées les unes à la suite des" echo "autres afin de vous permettre de visionner le résultat de votre dialogue." read -p "[appuyez sur n'importe quelle touche pour continuer]" attendre echo "" echo "Attendez maintenant que votre partenaire choisisse la première image..." elif [ "$chosenprompt" = 2 ] then echo "" echo "Vous avez choisi de jouer une partie sur le thème de :" echo "$prompt2." cd cd $DJ touch prompt.txt echo "$prompt2" >> prompt.txt echo "" echo "Vous allez à présent échanger des images avec votre partenaire afin de construire" echo "un court récit sur ce thème. À tour de rôle, vous choisirez une image qui sera" echo "transmise à votre partenaire. Chaque fois que vous recevrez une image, vous aurez" echo "le choix de mettre fin à l'échange ou de le poursuivre en ajoutant une nouvelle" echo "image. Au terme de la partie, ces images seront compilées les unes à la suite des" echo "autres afin de vous permettre de visionner le résultat de votre dialogue." read -p "[appuyez sur n'importe quelle touche pour continuer]" attendre echo "" echo "Attendez maintenant que votre partenaire choisisse la première image..." elif [ "$chosenprompt" = 3 ] then echo "" echo "Vous avez choisi de jouer une partie sur le thème de :" echo "$prompt3." cd cd $DJ touch prompt.txt echo "$prompt3" >> prompt.txt echo "" echo "Vous allez à présent échanger des images avec votre partenaire afin de construire" echo "un court récit sur ce thème. À tour de rôle, vous choisirez une image qui sera" echo "transmise à votre partenaire. Chaque fois que vous recevrez une image, vous aurez" echo "le choix de mettre fin à l'échange ou de le poursuivre en ajoutant une nouvelle" echo "image. Au terme de la partie, ces images seront compilées les unes à la suite des" echo "autres afin de vous permettre de visionner le résultat de votre dialogue." read -p "[appuyez sur n'importe quelle touche pour continuer]" attendre echo "" echo "Attendez maintenant que votre partenaire choisisse la première image..." fi # OU plus vieux : attendre jusqu’à être averti du thème # + petite tirade explicative sur le jeu qui va suivre… if [ $dateP -gt $dateJ ]; then echo "" echo "Attendez que votre partenaire choisisse un thème pour la partie..." cd while [ ! -f $DP/prompt.txt ]; do sleep 1; done cd $DP prompt=$(cat prompt.txt) echo "" echo "$nomP a choisi le thème :" echo "$prompt" echo "" echo "Vous allez à présent échanger des images avec votre partenaire afin de construire" echo "un court récit sur ce thème. À tour de rôle, vous choisirez une image qui sera" echo "transmise à votre partenaire. Chaque fois que vous recevrez une image, vous aurez" echo "le choix de mettre fin à l'échange ou de le poursuivre en ajoutant une nouvelle" echo "image. Au terme de la partie, ces images seront compilées les unes à la suite des" echo "autres afin de vous permettre de visionner le résultat de votre dialogue." read -p "[appuyez sur n'importe quelle touche pour continuer]" attendre echo "" echo "Vous devez maintenant choisir la première image de l'échange." echo "Ouvrez votre navigateur web, et enregistrez l'image de votre choix dans :" echo "$DJ/download." fi # (5) Initiation du cycle d’échange d’image # Boucle d’échange qui ne s’interrompt qu’à la demande expresse d’un des deux joueurs # Vérification de la présence de fichiers plus récents que les fichiers temporaires placés dans chacun des dossiers ‘download’ et ‘copy’ until [ "$stop" = "oui" ] || [ "$newfilecp" = "stop.txt" ] do sleep 2 cd cd $DLJ newfiledl="$(ls -t | head -n1)" # Si nouvelle image dans le dossier ‘download’, celle-ci est copiée vers le dossier ’copy’ du partenaire if [ ! "$newfiledl" = "temp.txt" ] then cd cp "$DLJ/$newfiledl" $CPP cp "$DLJ/$newfiledl" $DGIF cd $DLJ touch temp.txt echo "" echo "Votre image a bien été ajoutée." echo "Patientez pendant que votre partenaire choisi la prochaine image...". fi cd cd $CPJ newfilecp="$(ls -t | head -n1)" # Si nouvelle image dans le dossier ‘copy’, celle-ci est affichée à l’écran, puis le joueur a alors le choix de poursuivre ou de mettre un terme à l’échange if [ "$newfilecp" = "temp.txt" ] then true elif [ "$newfilecp" = "stop.txt" ] then echo "Votre partenaire a choisi de conclure l'échange." else echo "" echo "Votre partenaire a ajouté une image." echo "Fermez la fenêtre de l'image pour continuer." open -a Preview "$newfilecp" touch temp.txt echo "" until [ "$suite" = "oui" ] || [ "$suite" = "non" ] do read -p "Souhaitez-vous ajouter une nouvelle image pour poursuivre le jeu ? oui/non " suite done if [ $suite = "oui" ] then suite=a echo "" echo "Pour continuer le jeu, ajoutez une nouvelle image." echo "Recherchez cette nouvelle image dans votre navigateur web." echo "Une fois que vous l'avez trouvée, enregistrez-la dans :" echo "$DLJ" elif [ $suite = "non" ] then echo "$suite" until [ "$stop" = "oui" ] || [ "$stop" = "non" ] do echo "" echo "Êtes vous sûr(e) de vouloir mettre fin au jeu ? oui/non" read stop echo "" done fi if [ $suite = "non" ] && [ $stop = "non" ] then suite=a stop=b echo "" echo "Pour continuer le jeu, ajoutez une nouvelle image." echo "Recherchez cette nouvelle image dans votre navigateur web." echo "Une fois que vous l'avez trouvée, enregistrez-la dans :" echo "$DLJ" elif [ $suite = "non" ] && [ $stop = "oui" ] then echo "" echo "Vous avez choisi de mettre un terme au jeu." cd cd $CPP touch stop.txt fi fi done # (5) Création et vision du GIF final # Création d’un dossier ‘JUDA’ sur le bureau (si il n’existe pas déjà) cd cd Desktop if [ ! -d juda ] then mkdir juda fi cd # Le joueur qui a choisi de mettre un terme à l’échange est responsable de la réalisation du gif if [ "$stop" = "oui" ] then cd cd $DGIF # renommer les images dans l’ordre de chronologique n=0; ls -tr | while read i; do a=$((a+1)); new=$(printf "%03d."${i##*.}"" "$a"); mv -- "$i" "$new"; done # uniformiser le format et compiler le gif + le copier dans ‘JUDA’ mogrify -resize 480x860 *.* convert -delay 50 -loop 0 *.* "$nomJ$nomP.gif" imgf="$nomJ$nomP.gif" cd cp "$DGIF/$nomJ$nomP.gif" "Desktop/JUDA" # Nettoyer après soi - épisode 2 # L’autre joueur est chargé d’attendre que le gif soit achevé pour le récupérer (copie dans ‘JUDA’) puis de supprimer le dossier de jeu commun elif [ "$newfilecp" = "stop.txt" ] then until [ -f "$DGIF/$nomP$nomJ.gif" ] do sleep 1; done cd cp "$DGIF/$nomP$nomJ.gif" "Desktop/juda" imgf="$nomP$nomJ.gif" cd echo "on efface ici" rm -r "$DJP" fi # Information au joueur + visionnage du résultat final cd cd $Desktop/juda open -a Firefox "$imgf" echo "Fermez la fenêtre du gif animé pour achever le jeu. Vous pourrez le retrouver dans le dossier "juda" qui se trouve sur votre bureau." break