岡持ちMac Pro定点カメラ画像からffmpegでタイムラプス動画処理の自動化

公開
図3.過去の定点カメラ映像を全てタイムラプス変換

ffmpeg で岡持ちMac Pro(Mid 2010)のディスプレイインカメラから繰り返し撮影した静止画像を自動生成する 定点カメラ を組んだ前回に続き、今回は画像をffmpegで連結して1つの タイムラプス 動画ファイルへ変換する処理に取り組みます。

ストレージ内に溢れる撮影画像

前回、岡持ちMac Pro(Mid 2010)のApple LED Cinema Display (27”) の上部インカメラをffmpegで定点カメラのように静止画像を自動撮影する仕組みを構築しました。その後なかなかタイムラプス動画にする仕組みに取り掛かれずに放置していたので、ストレージ内は撮影画像の山に。

図1.日毎のサブフォルダで溢れる

図1.日毎のサブフォルダで溢れる

図2.一日分の撮影画像セット

図2.一日分の撮影画像セット

前回作ったバッチは、 yyyymmdd 名で作ったフォルダ内に毎分撮影した静止画像を日付時刻名で保存していて、次のようなフォルダツリー構成になります。

今回はこの日ごとに小分けされたサブフォルダ毎にタイムラプス動画を生成し、問題なければその日のフォルダごと画像を削除し、タイプラプス動画ファイルも決められた個数を維持するよう、自動処理バッチを構築します。

 

ffmpegによるjpg画像の連結

ffmpegでは、連番ファイル名の画像群から以下の要領で簡単にタイムラプス動画を生成することが出来ます。

-framerate は秒当りのコマ数で、 1 にすると毎秒1コマ、画像は毎分撮影したものなので、1時間の画像をパラパラ閲覧するのに1分かかる計算になります。これでは少し遅い一方、あまり速くしてしまうと確認出来なくなるので、 2 としました。

 

h265エンコーディングで小さく

日当り3時間180枚の画像の総容量は11MB程度なのに対し、生成したタイムラプス動画がこれを上回るサイズになるのは納得出来ないので、h265エンコーディングに変えてフレームレートの違いともあわせてファイルサイズを比較してみました。

これにより、h265エンコーディング、フレームレート2とするのが現実的でしょう。

ちなみにh265エンコーディングをしていると、 loglevelerror にしていても次のような出力が抑制されずに出てきてしまいます。

これはコーデック指定の後ろに、x265向けのパラメータ -x265-params log-level=error を追加することで抑制できました。

以上より、タイムラプスを生成するためのffmpegパラメータは次のようになります。

 

動画ファイルの妥当性チェック

静止画からタイムラプス動画を生成し終えたら画像ファイル群を削除したいのですが、その前に動画ファイルに問題無いか、その妥当性をチェックしたいと思います。チェックにはいくつかの方法がある中で、今回使ってみるのはこちらのフォーラムで見掛けた ffmpeg -f null に掛けてみる手法です(Great Tnx!!)。

まず生成したタイムラプス動画をチェックしてみると、正常な動画・画像ファイルでは無出力で、 $? になります。

次に拡張子を詐称したファイルをチェックに掛けてみると不正が見つかり、 $? は 1 になります。

以上より、 $? を見て処理を切り分けることは出来そうです。

 

サブフォルダの一覧ループ処理

サブフォルダの一覧を取得してのループ処理は以下の要領で簡単ですが、得られるのがフルパスであることに少し注意が必要。末尾のフォルダ名のみが欲しい場合は、 basename $d とする必要があります。

 

保持ファイル上限を設けて古いものから削除

保持するタイムラプス動画数に上限を設け、それを上回る場合は古いものから削除する、という処理は以前、こちらの記事でさまざまなプラットフォームを例に紹介しました。

その中のシェルスクリプト版をベースに、macOS向けのデバッグを進めて、以下の3点について修正を施しました。

1.findの振る舞い

Linuxと同じ要領で find へパスを渡すと、渡したパスの末尾にスラッシュで重なってしまいます。

これは find へ渡すパスの後ろに * を付与して回避出来ますが、そうすると対象階層を指定する depth の起点がずれてしまうので、カレントディレクトリのみ対象とするには、 -maxdepth 0 とします。そして、Finderが生成した .DS_Store などの隠しファイルを除外する為の条件を追加して、ようやく期待通りの結果を得ることが出来ました。

2.xargsオプションの差異

find の結果を渡す xargs のオプションに -r0 と言うのを使っていると怒られるのですが、これは単に以下のようにして解決。

3.lsのモダンなオプションが無い

ls の出力にパスやファイル名に空白などのダメ文字が含まれる場合を想定して、クオーテーションで常に囲む次のオプションを利用していたのですが、これもありません。

これは以前検証した、BSDベースのAlt-Fと同じなのですが、macOSではダメ文字が含まれる場合には自動的にクオーテーションで囲んでくれるようなので、Alt-Fの時のようにエスケープで逃げる処理は加えませんでした。

 

完成したバッチ

こうして出来上がったバッチファイルは以下の通りです(cronで呼び出すつもりなので、ffmpegはフルパスで記述)。

これを前回作った静止画像撮影タスクが終わる頃合いで始めるよう、cronへ登録して数日動かしたところで、ファイルに埋め尽くされていたストレージに秩序が戻りました。

図3.過去の定点カメラ映像を全てタイムラプス変換

図3.過去の定点カメラ映像を全てタイムラプス変換

 

コメントを残す

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

CAPTCHA