Linux - 複数の静止画から動画を作成!
Updated:
当方の自宅サーバ(Scientific Linux 6.1)では USB カメラを使用してライブカメラを運用しています。 ※正確には30秒毎にキャプチャした静止画(JPEG)を公開しているだけですが・・・
たいした画像ではありませんが、当方のWebサイトを探せばキャプチャ画像は見られます。
先日は、Ruby + OpenCV によるキャプチャも試してみました。 キャプチャは可能でしたが、画質がイマイチなので、当面 Ruby + OpenCV での運用は断念しました。(本来推奨されている C による方法では未検証)
小さなファイルですが、日々大量のJPEG画像が保存されていくので、深夜に1週間前の画像を削除する処理を走らせています。
そこで、折角なので1日分のJPEG画像を1つの動画にまとめてみようと思い立ちました。 調べてみると、ffmpeg を使用する方法と mencoder を使用する方法が主にヒットしましたが、今回は mencoder を使用する方法を試行しました。
以下に今回試した手順を記録。 (色々なサイトを参考しました)
作業手順
1.前提条件
以下の作業を行う上での前提条件です。
- 使用環境は Scientific Linux 6.1
- 静止画の保存先ディレクトリは /hoge/webcam/ (仮名)
- 静止画は上記のディレクトリに 111201235959.jpg のように日時を YYMMDDHHMMSS 形式にしたファイル名で保存してある。 動画化するには画像の新旧が分るような数字で終わるファイル名で作成されている必要があります。
- 静止画は30秒に1回保存されている。
- 作成する動画は日ごとに /hoge/webcam/archive/webcam_111201.avi というファイル名で作成する。
- 静止画は念のため1週間保存する。
- 動画は今のところ自動削除はしない。
2.mencoder のインストール
エンコードパッケージ mencoder を yum でインストールします。 Scientific Linux のデフォルトのリポジトリには mencoder は存在しないので、rpmforge を利用しました。 ※以下は、rpmforge をインストールしているが、他リポジトリとのパッケージの競合をさけるため、enabled=0 として普段は読まないような設定にしているため、 “–enablerepo=rpmforge” オプションを付けています。
# yum --enablerepo=rpmforge -y install mencoder
3.シェルスクリプトの作成
以下のような内容でルートディレクトリにシェルスクリプトを作成する。 (ファイル名:webcam_encode.sh)
# vi webcam_encode.sh
#!/bin/bash
# 画像保存ディレクトリ
webcam_path="/hoge/webcam/"
# JPEG画像からAVI動画作成(前日の静止画を動画化)
mencoder "mf://${webcam_path}`date -d '1 days ago' +%y%m%d`*.jpg" -mf type=jpg:fps=15 -o "${webcam_path}archive/webcam_`date -d '1 days ago' +%y%m%d`.avi" -ovc lavc -lavcopts vcodec=wmv1
# 不要なJPEG画像を削除(7日前の静止画を削除)
rm -f ${webcam_path}`date -d '7 days ago' +%y%m%d*.jpg`
※上記で一番重要な “mencoder ・・・” について
mencoder "mf://静止画保存先パス/*.jpg"
-mf type=静止画画像形式:fps=フレームレート(秒間コマ数)
-o "保存する動画ファイル名.avi"
-ovc lavc -lavcopts vcodec=エンコードタイプ(wmv1, wmv2, mpeg4, msmpeg4等のコーデック)
4.シェルスクリプトの権限変更
作成したシェルスクリプトに実行権限を与える。
# chmod 700 webcam_encode.sh
5.動画保存先ディレクトリの作成
初めて実行する場合は動画保存先が存在しないので、ディレクトリを作成しておく。
# mkdir /hoge/webcam/archive
6.シェルスクリプトの cron 登録
毎日、自動で処理を行うために cron 登録する。 以下は毎朝4時55分に処理を行い、エラーがあった時のみ root 宛メール通知する場合。
# vi /etc/cron.d/webcam_encode
55 4 * * * root /root/webcam_encode.sh > /dev/null
これで、毎朝4時55分に前日の静止画(JPEG)が1つの動画(AVIファイル、ファイルサイズ約13MB、再生時間約3分)が作成され、7日前の静止画は削除されます。 大量にあった静止画より管理しやすくなったので保存期間を延ばせます。 かと言って、当方の場合基本的にデスクトップを写しているだけの画像ですが・・・
また、もっと滑らかな動画にしたければキャプチャ間隔を1秒とか3秒とかにすればよいのですが、非力なサーバにあまり負荷をかけたくないので、今のところは30秒間隔のキャプチャとしています。
以上。
Comments