いまどきのノートPCには、かなりの割合で「カメラ」が搭載されている。その理由はFaceTimeのようなビデオチャットで必要とされるためだが、カメラなのだから他の目的に使用しても問題はない。というより、ビデオチャットは人によって利用度合いの差が激しく、使わない人はまったく使わないのだから、なにか有意義な用途を見つけたほうがいい。
方々探してみたところ、「imagesnap」というパブリックドメインソフトウェアを発見(リンク)。iSightやFaceTime HD CameraなどMacに映像デバイスとして認識されているカメラがあれば動作する、CUIベースのツールだ。
インストール方法はソースコードをコンパイルするか、以下のとおりHomeBrewでインストールすればOK。HomeBrewの場合/usr/local/binへインストールされるので、パスを通すなどの作業は必要なし、すぐに利用できる。まずは「image snap -l」を実行し、内蔵カメラが認識されていることを確認しよう。MacBook(Air/Pro)であれば、内蔵されているFaceTime HD Cameraのデバイス番号が表示されるはずだ。
$ brew install imagesnap
なお、imagesnapコマンドがTerminalから実行される最初のカメラデバイスへのアクセスとなる場合は、「"ターミナル"からカメラにアクセスしようとしています」というダイアログが表示される。これは、macOS Mojaveではセキュリティ/プライバシー強化の一環として、カメラやマイクへのアクセスにユーザの許可を求めるようになったためだ。
ここで「OK」ボタンを押すと許可され、システム環境設定「セキュリティとプライバシー」パネルの「プライバシー」タブにある「カメラ」項目にTerminalが追加される。後日取り消しが必要になった場合は、Terminalから以下のコマンドラインを実行しよう。これで、Terminalからのカメラデバイスへのアクセス許可が取り消される。
$ tccutil reset Camera
imagesnapコマンドは、引数を与えずに実行するとカメラで撮影を実行し、「snapshot.jpg」として保存する。サポートされる出力フォーマットはJPEGのみで、解像度はカメラに依存する。つまり、ただ「imagesnap」だけを実行すると、カレントディレクトリに1280×720ピクセルの「snapshot.jpg」が生成される。
しかし、カメラの初期化には多少の時間が必要なようで、デフォルトの状態では真っ黒なJPEGが生成されてしまう。これを避けるためには、「-w」オプションで撮影を遅延させればいい(単位は秒、小数点可)。試したところ、0.2秒(-w 0.2)あたりから薄暗く映るようになり、0.7秒(-w 0.7)も経てばまずまずの明るさで撮影できる。1秒(-w 1)を指定しておけば確実だろう。なお、一度確認すればデバイス名を表示する必要はないので、ついでに「-q」オプションで出力を止めてしまおう。
$ imagesnap -q -w 1
これで、Terminalから任意のタイミングで写真を撮影できるようになったが、当然これでは実用的な意味での使いものにはならない。シェルスクリプトやApple Scriptに組み込むもよし、cronやlaunchdで定期実行するもよし、CUIなだけに使途はいろいろ考えられるが、もうひと工夫が必要だ。
一定間隔で撮影する用途には、「-t」オプションが有効だ。「-w」オプション同様に間隔を秒単位で指定できるうえ、指定したファイル名にタイムスタンプをくわえてくれるので、あとで写真を整理するときにも役に立つ。
Macに向かう自分の顔を撮ったところでうれしくないため、具体的な用途を考えてみたが……タイムラプスムービーの素材にするとか、コマ撮り動画を自作するとか、考えればいろいろありそう。FaceTime HD Cameraの画質はお世辞にもいいとはいえないが、"スクリプトで回す"というスマートフォンやコンデジにはない可能性がMac(のCUI)にはある。あとは、使い手の腕次第、アイデア次第だ。