雑多な日記

雑多である

画面キャプチャの後自動でgifに変換したい

モチベーション

Macのデスクトップに動画ファイルが追加されたら、自動的にGifを生成してみる - Qiita

この記事を読んで会社のwindowsPCでも同じことがしたいと思った。 Automatorの代替と言われるAutoHotKeyで何とか実現できないかと少し調べてみたけど、めんどくさそうだったので簡単そうなpythonに逃げた。 常駐するものやしなるべく軽くすべきなんやろうけどその辺あんまりわからん。

やりたいこと

  • Win + Gから呼べるゲームバーで保存した動画を自動でgifに変換する

    つかうもの

  • ffmpeg
  • watchdog

    コード

from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer
import os
import time
import subprocess
from logging import getLogger, StreamHandler, DEBUG

CAPTURE_DIR = "<キャプチャした動画の保存先>"
NEW_FILE_DIR = "<gifの保存先>"
CMD_TEMPLATE = "ffmpeg -i \"{0}\" \"{1}\""

logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)
logger.propagate = False

class ChangeHandler(FileSystemEventHandler):
    
    def on_created(self, event):
        logger.debug('[{0}]'.format(event.event_type) + str(event))
        file_path = event.src_path
        file_name = os.path.splitext(os.path.basename(file_path))[0]
        file_ext = os.path.splitext(file_path)[1]
        if file_ext != ".mp4":
            return
        gif_file_path = NEW_FILE_DIR + file_name + ".gif"
        if os.path.exists(file_path):
            while True:
                try:
                    size = os.path.getsize(file_path)
                    time.sleep(1)
                    if os.path.getsize(file_path) == size:
                        break
                except OSError:
                    time.sleep(1)
            subprocess.call(CMD_TEMPLATE.format(file_path, gif_file_path), shell=True)
    
    def on_modified(self, event):
        logger.debug('[{0}]'.format(event.event_type) + str(event))
    
    def on_deleted(self, event):
        logger.debug('[{0}]'.format(event.event_type) + str(event))
    
    def on_moved(self, event):
        logger.debug('[{0}]'.format(event.event_type) + str(event))

observer = Observer()
observer.schedule(ChangeHandler(), CAPTURE_DIR, recursive=True)
observer.start()

while True:
    time.sleep(3)

こまったこと

  • キャプチャ中のファイルをffmpegに投げようとして怒られる
    • ファイルサイズをとってきて1秒間変わってなければ、キャプチャ終わったことにしてffmpegに投げるようにした

感想

コピペ駆動開発はほんまあかんのわかってはいるんやけどやめられんの悲しい

参考

Python WatchDog - フォルダの監視を行う - PythonとRPAで遊ぶ

ファイルの更新をきっかけにコマンド実行 (python編) - Qiita

ログ出力のための print と import logging はやめてほしい - Qiita

おわり