特定のウィンドウだけの動画とGIFを保存したい (Python デスクトップキャプチャ)
本日の課題と目標
Pythonでデスクトップの動画キャプチャを作る
特定のウィンドウだけをキャプチャする
動画と一緒にGIFでも保存する
今後の目標
録画時間と待機時間を自由に変更できるようにする
保存するウィンドウの名前を指定できるようにする
はじめに
完成したプログラムの動きのあるところを貼り付けたかったのでフリーソフトを探そうとしましたが自分で作れればいいなと思い挑戦してみました。
苦労した点は、保存した動画の色が変になってしまい原因がわからなかったところです。
プログラムのコード
# 画像書き込み import cv2 # 型変換 import numpy as np # スクリーンショット (引数で座標指定可) from PIL import ImageGrab # WindowsAPI を触るため import ctypes # 時間計測 import time # ウィンドウ名を探す用 import win32gui # 初期設定 movie_time = 5 # 録画時間(秒) window_name = 'test' # ウィンドウの名前 # 開始時間の保存 sTime = time.time() # 準備時間 while True: if time.time() - sTime > 3: break # ウィンドウ名を探す用 # 現在アクティブなウィンドウ名を探す process_list = []
def callback(handle, _): process_list.append(win32gui.GetWindowText(handle))
win32gui.EnumWindows(callback, None) # ターゲットウィンドウ名を探す for process_name in process_list: if window_name in process_name: hnd = win32gui.FindWindow(None, process_name) break else: # 見つからなかったら画面全体を取得 hnd = win32gui.GetDesktopWindow() # ウィンドウサイズ取得 x0, y0, x1, y1 = win32gui.GetWindowRect(hnd) x0 += 7 x1 -= 7 y1 -= 7 width = x1 - x0 height = y1 - y0 capSize = (width, height) # コーデックの設定 今回は.mp4 fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 動画保存用 writer = cv2.VideoWriter('SC.mp4', fourcc, 10, capSize) # gif用 images = [] # FPSのカウント用 1度だけ count = 0 FirstFlag = True # writerが開いている間、ループ while (writer.isOpened()): # PIL Image から numpy配列 に変換してから書き込み img_bgr = np.asarray(ImageGrab.grab(bbox=(x0, y0, x1, y1))) img_rgb = img_bgr[:, :, [2, 1, 0]] # BGR -> RGB順に writer.write(img_rgb) # gif用 images.append(ImageGrab.grab(bbox=(x0, y0, x1, y1))) # FPS取得 1度だけ if FirstFlag: count += 1 # 開始から1秒たったら、そのときのcountをFPSとする if time.time() - sTime > 1.0 + 3: writer.set(cv2.CAP_PROP_FPS, count) FirstFlag = False # 開始から録画時間(秒)で終了 if time.time() - sTime > movie_time + 3: break # gifファイルを保存 images[0].save('gif_date.gif', save_all=True, append_images=images[1:], optimize=False, duration=60, loop=0) # writerの解放 -> 保存 writer.release()
プログラムの流れ
今開いている全てのウィンドウの中からタイトル名に検索文字が含まれてるウィンドウを1つ探して位置と大きさの情報を取得します。
その範囲の画像データを時間ごとに記録して指定の時間が経過したら動画ファイルとGIFファイルにして保存します。
録画時間は動作環境により正確な秒数にならないと思います。
参考サイト
保存ファイル
lesson41.py
文責:Luke