岡持ちMac ProのApple Cinema Display内蔵カメラをffmpegで撮影

公開 | 更新 

ffmpegからiSightカメラを呼ぶには

まず次のコマンドでiSightカメラのデバイス番号を確認します。なお、 -hide_banner オプションを付記すると、ffmpeg実行の度に冒頭に現れるバージョン情報を抑制することが出来ます。

上記結果の [0] Display iSight から、デバイス番号が確認できたので早速、静止画撮影してみましょう。

JPG画像も正常に出力されましたが、少しターミナルに吐かれたメッセージが多いので、順に追いながらオプションの改善を図ります。

その前に、撮影に使用した基本的なオプションは次の3つ、

-video_size 1280×1024

これは入力デバイスの解像度なので、-i “0”という入力デバイスオプションよりも前に記述しないと効きません。

-framerate 30

今回は静止画取得なので、このオプションは要らないのではと勘違いして、フレームレートを指定しないで実行すると、次のように怒れられます。

期せずして入力デバイスのサポートする解像度とフレームレートの一覧を得ることが出来ました。解像度と共に必ず指定する必要があり、これも入力デバイスの指定よりも前に指定する必要が有ります。

-vframes 1

これは静止画取得時に何枚目のフレームを取得するか指定するもので、必ず入力デバイス指定よりも後ろに記述しなければなりません。ffmpegのオプションは、ワークフローのように順序そのものにも意味があることをこの時点で既に痛感しました。

 

ピクセルフォーマットとプローブサイズの指定

-pix_fmt uyvy422

先ほどの実行結果から、まずは直後の次の部分を読み解くと、

オプションでピクセルフォーマットを指定しなかったので、デフォルトで「yuv420p」が選択されたものの、入力デバイスのサポート外であることから、「uyvy422」に変更された、と言うもの。結果的に画像は取得出来ていますが、実行の度にこの挙動が出るのは不衛生なので、実行時にピクセルフォーマットを入力デバイスの指定より前方に明記します。

-probesize 10M

次に着目するのはこのメッセージ、プローブサイズを増やしなさいと言うアドバイスですが、

調べてみるとffmpegユーザメーリングリストのアーカイヴに答えはありました。このオプションも入力デバイス指定よりも前に記述しなければなりません。

– loglevel error

そして最後にこのメッセージが連続発生する現象、

静止画イメージ書き出し側のピクセルフォーマットを明記して解決した例に習い、オプション後方に書き出し用の -pix_fmt を指定したり、そもそも無視してもよい警告なので、 -strict -2 を記述しても警告は消えず。仕方ないのでログレベルで逃げることにします。

 

オーバーレイを追加

-vf  ビデオフィルタオプションを使うと、出力画像中にテキストを描画することが出来るので、これを利用して日付時刻のタイプスタンプを描きます。出力オプションなので、入力デバイスを指定するオプションの後ろに次のように記述します。

上記の場合、日付時刻が描かれますが、時刻のみとしたい場合は localtime の出力形式を次のように指定します。

また、 x=(w-tw)/2:y=h-(2*lh) はテキスト描画位置を指定(中央下段)するもので、指定の無い場合は左上になります。

図5.ffmpeg drawtext の描画位置指定

図5.ffmpeg drawtext の描画位置指定

尚、Ubuntuで試した際にはフォントファイルを指定せずとも良きに計らってくれたのですが、macOSでは明示的に指定しないと動きませんでした。

 

日付時刻を出力ファイル名に

オプションの最後に指定する出力するファイル名は、 -strftime 1 をセットすると日付時刻を扱えるようになります。

 

cronに登録して指定時間内連続自動実行

これまで説明してきた通り、ffmpegのオプション記述はかなり長く、そのままワンライナーでcronへは記述出来ないので、簡単なバッチファイルにしておきます。

これを試しに平日の夕刻に数時間撮影するよう、一般ユーザのcronジョブとして追加します。

以下の要領でcronの編集後に既存のプロセスを殺すことで、自動的に立ち上がる新規プロセスが新しいジョブ一覧を読み込みます。

 

数日後、日単位のサブフォルダで仕切られる形で、撮影された画像が格納されました。

図6.日単位のサブフォルダ

図6.日単位のサブフォルダ

図7.サブフォルダ内の撮影画像

図7.サブフォルダ内の撮影画像

 

このままではストレージを日々のキャプチャ画像が埋め尽くしてしまうので、次回は適当なローテーションや、日毎の静止画をタイムラプス動画にする処理を考えたいと思います。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA