Pillow の ImageGrab と pynput で、「ALT + Print Scr」に反応、して動画に

ImageGrab.html#grabclipboard(の後半)。

「ALT + PrntScr」による静止画の連続の方が、「完全なスクリーンキャスト」よりも適切な場合もある。「Fedora の dnf がインストールした先を知りたくても」の動画がまさにそうで、これは何もキーストロークなんぞをリアルタイムに見せる必要なんかなくて、根本的には「見せたいとこだけ撮影」したかった。

で、ALT + PrntScrn を繰り返して静止画をチマチマ作って後から ffmpeg で動画にするのと、desktoprecord.pyで撮るだけ撮ったのちにゴミ掃除するのとで手間を天秤にかけ、そのときは後者の方がマシだったがために「ffmpeg での crop、末尾カット、部分カット、にまつわる雑なメモ」なんてことが必要になった。

まぁなんだかんだサクっと正味一時間くらいで作ったけど、ImageGrab.html を書きつつなので、1時間半くらいかな?

まずは pynput、使いやすくていいね。これは ctypes でダイレクトにシステム API にアクセスすることで、グローバルなキーストロークのモニターが出来る。この手の、雑に探すと「アプリケーションがアクティブな場合に使える」ヤツしか見つからないのね、当然「kbhit 使えるんだぜっ」みたいな、この場合は見当はずれの「答え」は大量にヒットする。(てかそんなでいいなら多分 raw_input でもいいんじゃねーの。)

今回は pynput はモニターに使ったけれど、特定のウィンドウハンドルに向けてキーイベントを飛ばすことも出来るので、いわゆる「ロボット」的な処理が書ける、と思う。ブラウザ相手の自動処理なんぞを自作したかったら使えるかもしらんね。

ImageGrab.html#grabclipboardに書いたものでもかなり十分なんだけれど、「所詮 example」な立場で書いてる都合、あえて完全にしてない。わかる? これは動画のサイズ (width, height) の自由度、埋め込む静止画の変形の自由度ね、たとえば動画のサイズに引き伸ばしたり、アスペクト比維持して引き伸ばしたり、とか色々。


追記:
実際に動かした結果がないとなんかさみしいので、今テキトーにやってみた:

--duration-per-shot=1250でエンコードしてる。つまり、1回の ALT + PrntScrn 静止画あたり、1.25 秒の動画。あんまし例にしたような「サイト説明」的なことにはご用はなかろうけど、今思いつく手っ取り早い例を思いつかなかったんで。