やることは単純で、
- 静止画撮影コマンドをプログラムで定期的に起動
- ffmpegで動画にする
これだけです。
1.プログラム作成
色々試しながらやるのでpythonにて作成してみました。30秒毎に1枚、1時間記録してみます。(最初はキャプチャした時間をファイル名にするようにしてましたが、それだと動画にするのが大変だったので単純にカウンタにしました。)
capture.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
import datetime
import subprocess
# 画像保存エリア
cabstr = 'Cab/'
class test(threading.Thread):
def __init__(self, idx):
threading.Thread.__init__(self)
self.setDaemon(True)
self.i = idx
# captureに10秒くらいかかるので連続呼び出しには注意!
def run(self):
# print "Start."
# 日時を表す文字列の生成
# filename = datetime.datetime.now().strftime(u'%Y%m%d%H%M%S') + '.jpg'
# print filename
# 0埋め、後ろから4文字とる
filename = ("00000000" + str(self.i))[-4:]
# カメラでのキャプチャコマンド(640x400)
cmd = 'raspistill -w 640 -h 400 -o ' + cabstr + filename + '.jpg'
# cmd = 'ls -F'
subprocess.call(cmd, shell=True)
if __name__ == "__main__":
# t = test()
for loop in range(120):
t = test( loop )
t.start()
time.sleep(30)
24H動かすなら、本当はキャプチャしたファイルを転送することも考えないといけないんですが、そこまで本格的なことはとりあえず考えてないので、Raspberry Pi本体のSDに記録です。(32GBをのせてます)メモリを喰いたくないのと、それほど詳細な画像も必要ないので、640x400でキャプチャしてみました。
ちょっと注意が必要なのが、プログラムでは静止画キャプチャ(スレッド)を30秒毎(正確にはスレッド起動時間分だけだんだん遅れていくんですが)に起動しています。キャプチャにはRaspberry Piが提供しているコマンドをそのまま使っていますが、これが結構時間がかかります。(数秒くらい。下手すると10秒近いこともある。)最初、「5秒間隔で試すか」とやってみたら、なんかmmalエラーとかでてきて意味が分かりませんでした。(ぐぐっても関連するのはヒットしませんでした)
これ、raspistillコマンド実行中に別スレッドが起動して更にraspistillコマンドを実行するとリソースの衝突が起きていることを示しているエラーのようです。スレッドの起動間隔を10秒以上にしたらエラーがでなくなり、うまく動くようになりました。
2.動画にする
ここはffmpegのコマンドで静止画を動画にするだけです。(さすがにこれは別PCのUbuntuでやりました)
$ ffmpeg -r 2 -i %04d.jpg -vcodec mjpeg out.mp4
(Ubuntuでは最近"avconv"に変わったとも聞きましたが、両方入ってました。2枚/秒のレートで動画にしてみました。(1時間分を1分の動画に短縮することになります)「-vcodec」オプションが怪しい気がしますが、とりあえずこれで変換できたようです。)
3.おまけ
今回はリモートログインしたままで実行しましたが、実際に長時間監視するときはそうもいきません。バックグラウンドで動かして、ログアウトしたくなります。そんなときは以下のようになります。
$ nohup ./capture.py &
0 件のコメント:
コメントを投稿