webcamで出力した画像をmencoderで動画にする

現在、CentOSにEYETOYカメラを認識させ、xawtvをインストールしたときに同梱されていたwebcamコマンドで定期的に監視しています。
過去の映像を見るとき、いちいちFTPで一つ一つ見に行くか、Apacheで外部公開してWeb上から一つ一つ見に行く方法は非常に面倒でした。

撮影した画像を動画にできれば、本格的な監視カメラが実現できるなということで、ようやくメドが立ったので掲載します(メドというか動画にすればいいと思い立ったのが昨日なんですけどね)。

使用するコマンドはwebcamとmencoderです。両方とも通常のリポジトリでは取得できないので、dagリポジトリを取得した上でインストールしてください。ここではインストールが済んでいる段階からはじめます。

webcamの設定(.webcamrc)は以下の通り

  • 画像サイズ:640×480
  • 画質:50
  • 監視間隔:5秒
  • 動体検知:70
  • ファイルの保存先は「/home/monitor/public_html/webcam/archive/year_%H/month_%M/day_%S」とする ※自動的に日付別でディレクトリが分けられる
  • ファイル名は「live_%H%M%S.jpg」(時分秒)とする

単純にmencoderで画像を結合して動画を作成する方法は以下のコマンドでできます。

# cd 画像の並んでるディレクトリに移動
# mencoder "mf://画像のパス/*.jpg" -mf type=画像形式:fps=フレームレート -o 保存する動画ファイル名.avi" -ovc lavc -lavcopts vcodec=エンコードタイプ
例:mencoder "mf://*.jpg" -mf type=jpg:fps=15 -o output.avi -ovc lavc -lavcopts vcodec=wmv1
※対象ディレクトリ内のJPEGファイルすべてをフレームレート15でWMV1形式のAVIファイルで保存する

エンコードする際はファイル名が連番である必要があります。
webcamで監視するときのファイル名を時分秒の時間にしておけば、自動的に連番となるので便利。

上記のコマンドは対象のディレクトリ内での実行が前提なので、画像のパスをフルパスで指定する場合は、「mf:///home/monitor/public_html/webcam/*.jpg」という感じの書き方になります。

これで動画の作成は出来ると思います。

これだけでも十分な収穫なのですが、これもまたいちいち手作業で変換作業をしなければならないうえ、この長いコマンドをいちいち打つのも面倒です。

なので、自動で動画ファイルを作成するシェルスクリプトを作成し、一日の終わりに実行するようcronに登録します。

作成するシェルスクリプトのルールは以下のようにしました。

  • 24時(0時)を過ぎて10分後に作成
  • ファイル名は年月日とし、日付ディレクトリではなくarchiveディレクトリに作成する
  • 作成後の画像ファイルは残すと用量を切迫するので削除する

変換用シェルスクリプトを作成

# vi /root/jpgtoavi.sh

※共通するパスは長いので変数に入れておく
webcam_path="/home/monitor/public_html/webcam/archive/"

※「date -d ‘1 days ago’」は現在日時の一日前を参照。cronで作業する時間が翌日であるため、そのままdate取得するとずれてしまう。
mencoder "mf://${webcam_path}`date -d ‘1 days ago’ +year_%Y/month_%m/day_%d`/*.jpg" -mf type=jpg:fps=15 -o "${webcam_path}/archive_`date -d ‘1 days ago’ +%y%m%d`.avi" -ovc lavc -lavcopts vcodec=wmv1

※動画作成後は対象日の画像ファイルを削除
rm -rf "${webcam_path}`date -d ‘1 days ago’ +year_%Y/month_%m/day_%d`/"

アクセス権を変更

# chmod 755 /root/jpgtoavi.sh

cronに登録

# crontab -e

※毎日0時10分に実行
10 0 * * * /root/jpgtoavi.sh

上記の書き方は実行結果をroot宛にメールを送ることになりますが、必要ない場合はパスの後ろに「> /dev/null 2>&1」を追加してください。

丸一日分の動画で大体100Mくらい、再生時間は17分程度でした。動体検知してない場合はもう少し長くなると思います。

画像サイズが640×480なので、320×240などもう少し小さくすれば容量を稼げるでしょう

今は屋内だけでテスト運用してますが、例えば空の模様を丸一日撮るのも面白いかもしれません。たまに部屋で猫が寝てるとちょっとうれしかったり。身内が部屋に入ってきてたり。べつになんもないですけど。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中