[PYTHON] Créer une animation GIF avec surveillance des dossiers

Pourquoi l'animation GIF

Si vous développez une application pour smartphone ou un frontal, vous souhaiterez peut-être publier une vidéo sur les problèmes et les demandes d'extraction sur Github. Cependant, il ne prend pas en charge le téléchargement de fichiers vidéo tels que mp4. J'obtiens une erreur comme celle-ci lorsque j'essaye de télécharger un fichier mp4.

Cependant, il prend en charge le téléchargement de fichiers GIF et GIF a une fonction d'animation. Il y a un compromis en matière de qualité d'image, comme jusqu'à 256 couleurs, mais vous pouvez l'utiliser pour publier des vidéos.

Pourquoi la surveillance des dossiers

Je développe généralement des applications Android, mais je me sentais inefficace dans le processus actuel de création d'animation GIF. (Le processus est basé sur Mac)

** Processus 1 ** Enregistrez l'écran de l'appareil Android

  1. Cliquez sur l'onglet sous Logcat dans Android Studio
  2. Vérifiez si le Logcat du terminal à enregistrer est affiché.
  3. Cliquez sur le bouton «Screen Record» en bas à gauche de Logcat
  4. Cliquez sur le bouton «Démarrer l'enregistrement»

image.png

Pour la section de ligne de commande, voir le supplément.

** Étape 2 ** Enregistrez le fichier au format mp4

  1. Sélectionnez un dossier de sauvegarde
  2. Définissez le nom du fichier selon vos besoins
  3. Cliquez sur le bouton «Enregistrer»

** Étape 3 ** Encodez au format d'animation GIF.

Convertissez le fichier mp4 en fichier gif avec la commande ffmepg. Étant donné que Github a une limite de 10 Mo pour les images téléchargées, la largeur est de 320 pixels et 10 ips pour réduire la capacité.

ffmpeg -i input.mp4 -vf scale=320:-1 -r 10 output.gif

** Étape 4 ** Importez sur Github

Vous pouvez télécharger une animation GIF en la faisant glisser et en la déposant dans le champ de saisie des commentaires de Github.

github.gif

Efficacité

Si vous surveillez le dossier, vous pouvez rationaliser votre travail en encodant automatiquement le processus - format d'animation GIF avec le fichier enregistré comme déclencheur.

Surveiller les dossiers

J'ai créé un programme Python comme celui-ci.

watch.py


import os
import time
from watchdog.events import FileSystemEventHandler
from watchdog.events import FileCreatedEvent
from watchdog.observers import Observer
from pathlib import PurePath
import subprocess
import signal


class MovieFileSystemEventHandler(FileSystemEventHandler):

    def on_any_event(self, event):
        if(type(event) == FileCreatedEvent):
            src_path = event.src_path
            pp = PurePath(src_path)
            if pp.suffix != '.gif':
                output_path = "%s/%s.gif" % (os.path.dirname(src_path), pp.stem)
                subprocess.run(['ffmpeg', '-i', event.src_path, '-vf',
                                'scale=320:-1', '-r', '10', output_path])


exit_flag = False


def handle_exit(sig, frame):
    global exit_flag
    exit_flag = True


signal.signal(signal.SIGINT, handle_exit)
signal.signal(signal.SIGTERM, handle_exit)


path = "%s/movie" % os.environ['HOME']
event_handler = MovieFileSystemEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
while exit_flag == False:
    time.sleep(1)

observer.stop()
observer.join()

Ce programme utilise une bibliothèque appelée Watchdog, donc installez-le avec la commande pip.

pip install watchdog

Ce programme surveille également ~ / movie et enregistre l'animation gif encodée au même endroit, mais si vous préférez un dossier différent, réécrivez cette partie comme vous le souhaitez.

path = "%s/movie" % os.environ['HOME']

Créez un dossier de surveillance.

mkdir ~/movie

Exécutez le programme Python. Ce sera un programme pour les résidents.

python watchdog.py

Cela surveillera le dossier. Si le fichier vidéo est enregistré dans le dossier de surveillance, un fichier d'animation gif avec le même nom sera automatiquement généré.

watch.gif

Pour mettre fin au résident, appuyez sur Ctrl + C sur la console.

Supplément

Installez ffmpeg

Vous pouvez l'installer à l'aide de brew.

brew install ffmpeg

Enregistrer l'écran Android à partir de la ligne de commande

adb shell
adb /mnt/sdcard
#Commencer l'enregistrement
screenrecord output.mp4
# Ctrl +Terminer l'enregistrement avec C
exit
adb pull /mnt/sdcard/output.mp4

Précautions lors de la conversion vers Docker

La conversion Docker est également possible. Cependant, dans certains cas, cela ne fonctionne pas correctement. L'enregistrement directement depuis Android Studio dans le répertoire de surveillance est bien, mais le déplacement d'un autre dossier ne fonctionnait pas correctement.

FROM python:3.7-alpine
WORKDIR /root/
RUN apk add --update --no-cache ffmpeg
RUN pip install watchdog
COPY watch.py .
CMD python watch.py

docker-compose.yml


version: '3'
services:
    main:
        build: .
        volumes:
            - ~/movie:/root/movie

Construisez et exécutez.

docker-compose build
docker-compose up

Détails des cas qui ne fonctionnent pas correctement

class MovieFileSystemEventHandler(FileSystemEventHandler):

    def on_any_event(self, event):
        # type(event)Confirmer

Lorsque j'ai déplacé un fichier d'un autre dossier vers un dossier surveillé, j'ai obtenu un FileModifiedEvent au lieu d'un FileCreatedEvent. Je voulais également convertir la vidéo en animation GIF avec FileModifiedEvent, mais lors de la copie à partir d'un autre dossier, FileModifiedEvent se produit après FileCreatedEvent, et j'ai pensé qu'il serait difficile de créer un déclencheur approprié.

Recommended Posts

Créer une animation GIF avec surveillance des dossiers
Créer une animation gif à partir d'un fichier de numéro de série avec matplotlib
Fabriquer un appareil de surveillance avec un capteur infrarouge
[Python] Surveillance des dossiers avec watchdog
Faites une loterie avec Python
Faire un feu avec kdeplot
Faisons une interface graphique avec python.
[IOS] Démontez l'animation GIF avec Pythonista3.
Créer un système de recommandation avec python
Créer un filtre avec un modèle django
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Créer un itérateur de modèle avec PySide
Faire un joli graphique avec plotly
Animation facile avec matplotlib (mp4, gif)
Faisons un jeu de shiritori avec Python
Créer un lecteur vidéo avec PySimpleGUI + OpenCV
Créer une animation GIF d'art ASCII avec Python
Créez un simulateur de gacha rare avec Flask
Créez un pipeline de notebook avec Kedro + Papermill
Faire une figure partiellement zoomée avec matplotlib
Créez un classificateur en cascade avec Google Colaboratory
Faisons un langage simple avec PLY 1
Faire un circuit logique avec Perceptron (Perceptron multicouche)
Faire Oui Non Popup avec Kivy
Faire une minuterie de lavage-séchage avec Raspberry Pi
Créez un framework Web avec Python! (1)
Faisons une IA à trois yeux avec Pylearn 2
Créez une application de bureau avec Python avec Electron
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Un mémorandum pour faire WebDAV uniquement avec nginx
Créer un bot Twitter Trend avec heroku + Python
Créez un simple générateur d'images par points avec Flask
Comment créer un dictionnaire avec une structure hiérarchique.
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Animation avec matplotlib
Remplaçons UWSC par Python (5) Faisons un robot
Essayez de créer un groupe de dièdre avec Python
Animation avec matplotlib
Gagner avec la surveillance
Transformez les données de vacances en une trame de données avec les pandas
Créer un bot LINE WORKS avec Amazon Lex
(Mémorandum) Créer un diagramme de dispersion 3D avec matplodlib
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Faisons un outil de veille de commande avec python
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]
Créez un Slackbot simple avec un bouton interactif en python
[Jouons avec Python] Créer un livre de comptes de ménage
Comment faire un jeu de tir avec toio (partie 1)
Essayez de créer un jeu simple avec Python 3 et iPhone
Faire un point d'arrêt sur la couche c avec python
Créer une fonction pour décrire les polices japonaises avec OpenCV
Facilitons un peu la gestion des dépendances avec pip
Créer un outil de formatage CSV avec Python Pandas Py Installer