パソコンの画面を録画する
パソコンの画面を録画して動画ファイルに保存します。ライブラリPyAutoGUIを使うとパソコン画面のスクリーンショットを取得できます。スクリーンショット画像を連続して取得し、OpenCVで動画ファイルに書き込むことで画面操作を録画します。PyAutoGUIのスクリーンショットではマウスカーソルが消えてしまうので 、PyAutoGUIでマウスの現在位置を取得しその位置にマウスカーソルの絵を描いています。
環境
- windows10 home
- Anaconda 3/ jupyter notebook 6.4.6
- Python 3.8.12
- pyautogui 0.9.53
- numpy 1.21.5
- OpenCV 4.5.5
コード
パソコンの画面サイズは1920x1080ですが画面下のタスクバーを消したいのでキャプチャーサイズを1920x1030としています。動画のレートは15FPS、録画時間を10秒に設定しています。画像一枚ごとの取得時間を計測しそれが1/FPS(15FPSの場合は0.0667秒)よりも小さい場合、時間合わせのためスリープを入れています。環境によると思いますが私のパソコンでは15FPSで実際の処理時間とトントン(スリープが入ったり入らなかったり)、25FPSでは処理が間に合いませんでした。間に合わない場合、例えば20秒の録画時間が10秒の動画となり早送りになってしまいます。
また、プログラムを実行して少し経ってから録画を開始するため初めに3秒間スリープしています。
import time import pyautogui import cv2 import numpy as np # 3秒スリープ time.sleep(3) # 動画のフレームレート fps=15 # 録画時間(秒) rec_sec = 10 # キャプチャー領域 cap_region = (0,0, 1920, 1030) # キャプチャー画像を格納するリスト frames = [] #画面をキャプチャーし for i in range(int(fps*rec_sec)): # 処理開始時間の取得 start = time.perf_counter() # 画面をキャプチャー cap = pyautogui.screenshot(region = cap_region) # pillow形式からOpenCV形式に変換 img = cv2.cvtColor(np.array(cap), cv2.COLOR_RGB2BGR) # マウス位置を取得しマウスの絵を描画 mx, my = pyautogui.position() pts = np.array([[mx, my], [mx, my+25], [mx+5, my+20], [mx+10, my+28],[mx+14, my+27],[mx+11, my+20], [mx+20, my+20]]) cv2.polylines(img, [pts], True, 30, thickness=1) # リストにキャプチャー画像を追加 frames.append(img) # 処理終了時間の取得 end = time.perf_counter() # 1回の処理時間が1フレームより短い場合、不足分スリープ if end-start<1/fps: time.sleep(1/fps-(end-start)) # 保存用動画ファイルのフォーマット設定 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('capture.mp4', fourcc, fps, (1920, 1030)) # キャプチャー画像を読み出して出力動画ファイルに追記 for img in frames: out.write(img) out.release() # 出力動画ファイルをクローズ
実行結果
画面を録画した動画ファイルが保存されます。
(下はサイズを縮小してアニメーションGIFに変換したもの)
以下のサイトを参考にさせていただきました
機械系エンジニアの備忘録 > 【python】デスクトップ画面をキャプチャ(録画)する簡易ソフトを作る
白猫学生のブログ > マウスカーソルの現在の座標の取得方法