• Slidy
  • Utilisateur:Juliette

    De Ustensile
    Aller à : navigation, rechercher

    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) ==
    


    [https://handbrake.fr ]

    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