俺だけ使える画面キャプチャツール
日々のライフワークのため、画面の一部領域をキャプチャして画像(静止画またはアニメーションGIF)として切り出したいことがあり、macOS用の画面キャプチャツールを自作した。
名作アニメ『俺だけ入れる隠しダンジョン』の影響から『俺だけ使える』と銘打ったが特に隠す理由もないのでソースコードは公開している。もともと自分用に作ったので使い方やビルド済みのバイナリ配布はないが、macOSで画面をキャプチャしてコマ単位で切り出したりアニメーションGIF化したい!という方がいたら参考になるかもしれない。
https://gitlab.com/castaneai/animeski
開発の背景
最初は GIF Brewery を使っていた。このツールは優秀で画面領域のキャプチャ、トリミング、クロッピング、アニメーションGIFへの変換など欲しい機能がすべて揃っている。よって数年間はこれを愛用していた。しかし、ヘビーに使っているといくつかの課題が浮上してきた。
- 録画開始の遅延
- 録画開始を押してから実際に録画が始まるまで数秒の遅延があった
- 最初の数秒がキャプチャできなくて困った
- 時々録画に失敗する
- 録画停止時にエラーが発生しツールがフリーズしてしまうため、長めの録画時にこれが発生すると大変困っていた
- アニメーションGIFへの変換速度
- 5〜10秒程度の動画でも変換に時間がかかる
- できれば数秒で変換してほしい
この問題を解決すべく、『俺だけ使えるキャプチャツール』 の開発を始めた。 自作キャプチャツールを支えてくれた素晴らしい技術たちを一部紹介する。
ScreenCaptureKit - 新世代のキャプチャ用API
最初は画面をキャプチャするために AVCaptureScreenInput というAPIを使った。試してみると録画開始に遅延がみられた。どうやらGIF Breweryの開始遅延もこのAPI由来だったようだ。
そんな中、macOS 12.3 (Monterey) から新しいAPI ScreenCaptureKit が登場した。 これは従来のキャプチャ系APIと比べてCPU負荷が低く、配信ソフトで有名なOBSでも最近採用され話題になったものだ。
macOS 12.3 MontereyではScreenCaptureKitが追加され、OBSなどでキャプチャ配信を行う際のFPSやCPU/GPU使用率が大幅に改善されるもよう。
『俺だけ使えるキャプチャツール』は名前通り自分しか使わないので古いmacOSとの互換性は気にしなくていい。早速最新のScreenCaptureKitを採用した。すると嬉しいことにキャプチャ開始時の遅延もほぼなくなった。 録画停止時のエラーはまだ稀に発生するが、無視して保存先の動画を開く処理にしてみたら録画データはちゃんと残っていたのでそれなら良し!と割り切った。
Gifski - 高速・高品質なアニメーションGIF
アニメーションGIFへの変換は Gifski を利用した。 画像処理技術のオタク(褒め言葉)1が作ったもので、本当にGIF?と思うほど高品質なGIFが作れる。また、変換速度も(GIF Breweryに比べて)非常に速い。
そして何より macOSアプリへの組み込み例 が公開されているのが嬉しいポイント。macOS native library static linkの経験はまったくなかったが、この例を参考に真似したらあっさりと実現できた。
所感
画面をキャプチャしてコマ単位を切り出したりGIF化する、それだけならすぐ作れるだろうと期待していたが、思ったより苦労した。
まずmacOSネイティブのアプリ開発の経験がなかったので、macOS APIの世界観を知り、SwiftとSwift UIを習得しながらの開発はけっこう時間がかかった。他のプログラミング言語ではすぐ書けるような処理でも思いつかなくて毎回調べるという手間があった。 さらに、macOSアプリ開発の情報や例が(他のWeb系やスマートフォンと比べて)少ないのでそこも苦労した。Apple Developer Documentationは網羅性はあるが、具体的にどうやって使うかというコードが載ってなくてわからないことが何度もあった。GitHubのCode Searchで該当のAPIを使っている例を調べたりして乗り切った。色々とあったけど目的は達成できたし勉強になってよかった。
脚注
-
Gifski開発者は自身で
Kornel Lesiński (AKA “that ImageOptim guy”)
と名乗っているので画像処理技術オタクであることは確かだ ↩