ラベル motion の投稿を表示しています。 すべての投稿を表示
ラベル motion の投稿を表示しています。 すべての投稿を表示

2022年5月31日火曜日

motion: いつの間にビルトインの動画出力と外部パイプ出力が同時に行われるようになったのだろう?

色々とソースを見ていて気付いた点があります。

基本動作としてmotionは、カメラで撮影した映像内の動体検知を行って記録すること。

ここから派生して記録する形式として、静止画と動画の大きく分けて2つがあり、動画は実際の映像と、動体検知を行っている処理の映像という2つの映像が存在します。

また実際の映像は、ビルトインのエンコーダで処理することもできるし、pipeを使って外部処理でエンコードすることもできます。

この機能は当初から存在してはいましたが、処理速度やビルド環境、実行環境に大きく左右される機能なのですが、体験記憶としては静止画と動画の同時出力はできていた記憶はあるのですが、実際の映像と検知処理の映像はどちらかしか出力できなかったと記憶していました。

現在のソースを見ていると実際の映像と検知処理の映像の同時出力を行うように作られており、さらにextpipe(外部パイプ)出力も同時に行う形になっていました。自分の中ではビルトインか外部パイプどちらかしか出力されないと思い込んでいて、外部パイプ出力の処理が予想以上に重たく感じられていたのです。なので微調整を行う過程で結局最後はビルトインエンコーダを使用する形で落ち着いていました。

motionの出力
┣静止画(全て/特定のフレーム)
┗動画
┣ビルトインエンコーダの出力 実際の映像
┣外部パイプへの出力 実際の映像
┗ビルトインエンコーダの出力 動作検知処理の映像

これらが同時に出力可能と言うことに今更気づいたのかよwとかいうレベルですが、ビルトインエンコーダと外部パイプ出力が同時に行われるという仕様をまったく想定していなかったので今まで理解できなかった不可解な現象がようやく理解できました。

不可解な現象を列記すると、

・ごくまれに出力された動画ファイルが壊れていることがあった。

・ビルトインの出力と外部パイプの出力で動体検知の癖が変わる。

・出力された動画をffmpegで処理すると、エンコーダを通していないのにファイルサイズが変わった。

・外部パイプを使用しているときにイベントスクリプト内(on_movie_end)で処理するときにまだ動画ファイルがクローズされていない。

・スクリプトの引数で%fを使用するときにファイルの拡張子がある場合とない場合があった。

などなど…まだあると思いますがこの辺が結構不可解だったポイントです。

仕様として、動体検知映像はファイルの末尾に"m"を強制的につけられるのですが、ビルトインエンコーダのファイル名と、外部パイプのファイル名は拡張子があるかないかの差しかありませんでした。(今まで、とりあえず外部スクリプトで拡張子がない場合は処理を行わないようにしていました。)

で、問題的な動作として、ビルトインエンコーダの出力と外部パイプの出力が同じファイル名になっていて、処理はビルトインエンコーダの出力→外部パイプの出力という順番で処理されるので、結果的にどうなるのかと言えば…

ビルトインエンコーダの出力が行われ、直後に外部パイプの出力が行われることにより上書きされてゆく結果に。

Windowsでそれなりの実装を行っていれば、おそらく外部パイプのファイル出力エラーとなるはずなのですが、Linux(Raspberry pi)では平気で処理が通ってしまい、ファイルサイズはどちらか大きいサイズ。出力内容は書き込みバッファサイズに依存してどうなることやらといった感じでしょうか。(ファイルの排他制御はファイルシステムに依存しているはずなので、ファイルシステムを変えると動作が変わるかも?)

大抵の場合、ビルトインエンコーダの出力は大きく、固定ビットレートなので外部パイプ出力を上書きしてしまうようなことがなかったために、動画が見れていた感じです。ファイルとしては映像の後に無駄なパディングが書き込まれている状態になったために、ffmpegで処理を行うと、その無駄なパディングが排除され、ファイルサイズが小さくなった、と。

なんか今まで不可解だった不安定な動作が一気にすっきりしました。

動体検知の癖の差はエンコード処理が単純に多くなるのでレスポンス低下による影響だと考えられます。

なぜこの辺のソースを追っかけたかと言えば、想定している機能とちょっとソースを見た感じ実装がずれていたので足りない部分を追加しようとしていたのですが、よくよく見てみると想定している仕様が違うということに気づきました…。

git上のソースを3.10ぐらいまでは遡れるのですが、そのくらいからは同時出力できる感じがしました。なので、おそらく当初からそういう仕様だったのかもw

2022年5月13日金曜日

motion: microlightswitch?

どこに需要があるかわからないmotionネタです…w

昨日から気になっていたほとんどまともに機能しないと思われるlightswitch関連。結論から言えば、処理速度があればあまり問題にならないのかもと思える結果となりました。

ここ数日の主なテスト環境はraspberry pi 3b plusで外部パイプを使ってffmpegでv4l2m2mのハードウェアコーデックを利用して動画を作成していました。

少なくても、この状態ではlightswitch関連の機能はほぼ絶望的な状態です。設定にもよりますが、ログを見てもmicrolightswitch!というログしか出てこなく、そのタイミングもかなり気まぐれな感じです。

そんな状況の中、githubでフォークさせてソースを直に変更してみました。(多分使い方が違うw)

気になるポイントとかも試しに書き換えたりデバッグ用のメッセージを入れたりと。

まずは設定項目を増やして、ついでに値の整合性を入力時に行えるように実装し直したりと少しづつ書き換えていると、ふと一つの疑問が。

「いつから機能しなくなったのだろう?」

と。しかし、私が知らなかっただけで、lightswitchの実装は結構古いらしく、ソースのヒストリーを見る限りこの辺りを変更した感じは無さそうでした。ソースの形式を大きく変えたのが4.3からの様でしたが、見ることのできる一番古い3.2でもlightswitch関連の実装がされているのを確認しました。

それだけ古くて誰も手を入れていないということは、全く使われていないか、設定によって動作が変わる?

と、ふと、一番特殊と思われる外部パイプの使用をやめてビルトインに任せてみました。

するとあら不思議。それなりに機能しているようなしてないような?そんな感じw(あんまり変わってない?w)

一番気に入らない点はlightswitch関連の機能を有効にすると録画される動画が不安定になることでした。が、ビルトインを使えばそんなことはなく、それなりに録画されました。

ってことは今度は外部パイプ周りを確認しなきゃかな?

ログを見る限りmicrolightswitchは普通に機能していない感じは強いかなぁ。

2022年5月11日水曜日

ffmpegの出力中にファイルを移動させると…

多分ファイルシステムが強固なwindowsなら、ファイル移動が失敗するのでしょうけど、linuxは簡単に移動できてしまう気がするのですが?

Windowsでも処理の実装方法によっては常にopenとcloseを繰り返している場合は処理中でも他からファイルを消したりすることはできるので、何とも言い難い部分だったり、そもそもそんな事するなと言うのが当たり前だったり。

まぁでもmotionだと内部からイベントの各タイミングで丁寧にフォークしてシェルコマンドが呼び出されてたりするので、かなり運用任せでいろいろできてしまうので表題のような処理になってしまいましたw

結論から言えば、運が良ければ動画ファイルとしては何とか通用するものとなりますが、ファイルフォーマット形式でいえば確実に破損状態となり、再生することもできなくなります。

motionで、ビルトインコーデックであれば外部イベント処理が呼び出される前に処理が完了している感じだったのですが、外部パイプでエンコーダ実行されている場合、エンコーダ自体もフォークされているっぽいので処理が終わってないことも。

試しに使ったlibx265とかだと、処理が重いためか確実に処理途中となってエラー処理になってしまっていました。ハードウェアが利用できると処理が軽くなるために今までは気になったことはないのですが、先ほど書いた記事にある通り、minimum_motion_framesを20とか頭の悪い設定していると、エンコード処理が間に合わずエラー処理へ。

で、そこからはエラー処理の話になるのですが、後からチェックできるようにエラーファイルはゴミも含めてフォルダに退避させているのですが…まだ出力中のファイルを移動することになって結局動画が死んでしまうというジレンマに。

そして結局取るべき措置としては、エンコードしている場合は処理を待ちましょうということ。

linuxではよくある話らしく、psとgrepを使ってプロセスを監視するのが当たり前の様で。

で、実装して処理を待つようにしました。ビルトインの場合はチェックができない…なのでまぁ外部パイプでエンコードしている場合のみですが回避できるように。

しかし、最初はそんなに大したことにはならないはずだったのに、結構色々詰め込んでしまった気がする。

motion: 引き続きlightswitchネタ


色々と調整しているとボケてしまっていたようで、lightswitchを有効にすると反応が鈍くなると感じたのminimum_motion_frames20になっていたのが原因かも。環境としては10FPSなので時間にして2秒間動かないと検知されない状態。そりゃ鈍いw

早速これを2フレームとかにすると反応は良くなりました。

いつ変えたのか正直記憶に無いわけでログを見直す気もないのでさっさと先に進むことに。

再度lightswitchを有効にして…様子を見ることに。

部屋を暗くしてライトをつけてもちゃんと防御してくれてるっぽい。ログにも
[1:ml1:D] [NTC] [ALL] [ 5月 11 20:22:14] mlp_actions: イベント11の終了
[1:ml1:D] [INF] [ALL] [ 5月 11 20:27:58] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [NTC] [ALL] [ 5月 11 20:40:53] motion_detected: モーションが検出されました. - イベント12を開始中

となっているのですが、ちょっと違和感…ログレベルを下げたのでdebugログが出てないかもしれないのでソースを確認しましたが…

MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("Lightswitch detected"));

と言うのが先に来なきゃいけないような?INFレベルだし多分処理が通過すればログに残るよね?

なんで

MOTION_LOG(INF, TYPE_ALL, NO_ERRNO, _("micro-lightswitch!"));

が先に出てしまってるのだろう?

ま、様子を見つつも…もっと強烈なのが来ました。

[1:ml1:D] [NTC] [ALL] [ 5月 11 21:46:06] motion_detected: モーションが検出されました. - イベント15を開始中
[1:ml1:D] [INF] [EVT] [ 5月 11 21:46:06] event_ffmpeg_newfile: ソースFPS 6
[1:ml1:D] [INF] [ENC] [ 5月 11 21:46:06] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214605D-15.mp4
[1:ml1:D] [INF] [ENC] [ 5月 11 21:46:06] ffmpeg_set_quality: libx264 コーデック vbr/crf /ビットレート: 30
[1:ml1:D] [INF] [EVT] [ 5月 11 21:46:06] event_create_extpipe: ソースFPS 6
[1:ml1:D] [NTC] [ALL] [ 5月 11 21:46:06] mycreate_path: ディレクトリ /home/motion/tmp/OrbitAF_2を作成しています
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_create_extpipe: パイプ: ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size 640x480 -framerate 6 -i pipe:0 -vcodec h264_v4l2m2m -b:v 4000k -f mp4 /home/motion/tmp/OrbitAF_2/20220511214605D-15.mp4
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_create_extpipe: cnt-> moviefps:6
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:46:06] event_newfile: 動画ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214605D-15
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:08] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:12] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:14] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:16] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:23] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:25] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:27] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:29] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:32] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:37] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:39] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:40] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:41] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:43] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:52] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:46:55] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:09] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:11] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:12] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:20] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:22] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [INF] [ALL] [ 5月 11 21:47:46] mlp_tuning: マイクロライトスイッチ!
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_newfile: 画像ファイルを出力中です: /home/motion/tmp/OrbitAF_2/20220511214725D-15-01.jpg
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_extpipe_end: クローズ中: extpipeファイルの説明 12、エラー状態 0
[1:ml1:D] [NTC] [EVT] [ 5月 11 21:48:19] event_extpipe_end: pcloseリターン値: -1
[1:ml1:D] [NTC] [ALL] [ 5月 11 21:48:19] mlp_actions: イベント15の終了


撮影された動画を見ると映像が出てこないw

ほかのも見てみると動画出力中にこの「マイクロライトスイッチ!」のログが混じっている場合はなんか動画が乱れて終わっていました。

なんだかコードの前後でthreshold_tuneとかnoise_tuneとか私は使ってないけど有望そうなパラメータも死んでそう…ま、置いといてw

やっぱりこの辺おかしくなってる感じですねぇ。


あとlightswtich関連の実装部分でやたらと範囲チェックして補正欠けてたりするんですが、ハッキング対策を考えるとありっちゃありだと思うんですが、理想論としてはやはり設定値を読み込んだり、外部から設定されるタイミングで範囲チェックして、補正するなら強制的に補正して取り込んで、処理中に設定値の範囲チェックなんてやってる場合じゃないと思うんですが。デバッグしてると疑心暗鬼になって不安に駆られて入れたくなるのは理解できるのですが。

motion: lightswitch

イベント周りの実装がかなり気になってきたので、少しソースを眺めていました。

気になっていたのは、動作検知して、検知状態に移ってから、解除されるまでの流れがきれいに出来上がっていて、その流れをうまくコントロールできるかどうか知りたかったからなのですが…。そもそもイベントループ中の無駄なループを排除したいという思惑はGW前からあったのですが、どのくらい処理が無駄になっているのかを比較したかったのですが、休み中は全く別の事で手一杯にw

その中で気になる逃げの実装になっている一つがlightswitch関連の設定値。

イベント関連の実装の手直しが結構最近行われていてこのような実装になっているのだと思います。現状では画像の差異の量を、lightswitchの条件下で強制的に0にしているのですが、このようなことを行うと後々痛い目を見そうな感じ。

実際にこの設定を使うと、結構色々なところで誤検知されているのを回避できるので便利そうなのですが、現状だと動作検知がかなり鈍くなっている気がします。

ついでに、昔は起動時や再起動時は普通に開始できたのですが、lightswitchの設定が無効の状態だと必ず最初に動作検知状態に突入し、処理が行われてしまいます。

停止と開始を切り分けず、再始動させれば発生しない感じではあるのですが、設定値をガンガンいじっている現状ではこの動作もかなり目につきます。

なので、この辺ちょっとテコ入れしたいかな…


あと、気づいてなかっただけかもしれませんが、昔は動作検知の出力と実際のカメラ画像はどちらかしか出力できなかったと思うのですが、現状では同時に出力させることができるというとても便利な機能に仕上がってたりして、検知反応を簡単に見れるようになっているのでそっちもテコ入れしたかったりw

まぁでもそこまで触れるかなぁ…

ffmpegのパラメータ周りも、codecの指定もできるようになっていて便利そうだったりするのですが、イマイチうまくいかなかったり、motionプロセス保護のためにblacklistまで用意して、特定のcodecのガードをかけていたり。ガードはすぐ外せるようになってるのですが、ガードがかかってないcodecを指定すると出力がまともにできなかったりするのでそっちも気になります。

2022年4月29日金曜日

motion: movie_max_time

 色々と調整して問題なくなったと思ったら、どうも1つのイベントから動画ファイルが分割されているという結果に。

このパラメータはVersion4.2でmax_movie_timeから名称が変わって movie_max_timeとなっているのですが、今までの意味合いと変わっていないと思っていましたがどうも違うようです。

昔のバージョンで max_movie_time はイベント開始からこの指定時間まで達すると、そこで一旦イベントが強制終了されて、event_gapなどの条件を経て、新たにイベント開始されていたのですが、これがイベントという単位と切り離され、単純に動画を分割するためのパラメータとなったようです。

結果から言えば、イベントと動画の関係は、1つのイベントという単位の中に複数の動画ファイルが発生するということ。

ソースからビルドしていままでファイルが分割されたことが無かったのはたまたまだったようです。

手持ちのソースは1イベント1動画1プレビュー画像という関係性を前提にしているので結構しんどい変更かもw

2022年4月20日水曜日

motionのログで

 ログを見ていて秒の表示がないので、バグ仕様だと思ってたんですが、よくよく見てみると秒の表示もある行があった。

[0:motion] [NTC] [STR] [Apr 19 23:39:21] webu_start_strm: Starting camera 1 stream on port 8085
[0:motion] [NTC] [STR] [Apr 19 23:39:21] webu_strm_ntc: Started camera 1 stream on port 8085
[0:motion] [NTC] [STR] [Apr 19 23:39:21] webu_start_ctrl: Starting webcontrol on port 8080
[0:motion] [NTC] [STR] [Apr 19 23:39:21] webu_start_ctrl: Started webcontrol on port 8080
[0:motion] [NTC] [ENC] [Apr 19 23:39:21] ffmpeg_global_init: ffmpeg libavcodec version 58.91.100 libavformat version 58.45.100
[0:motion] [NTC] [ALL] [ 4月 19 23:39:] translate_init: 言語:英語
[0:motion] [NTC] [ALL] [ 4月 19 23:39:] motion_start_thread: カメラID: 1は /etc/motion/BSW20KM11BK.confから設定されています.
[0:motion] [NTC] [ALL] [ 4月 19 23:39:] motion_start_thread: カメラID: 1カメラ名: Eデバイス: /dev/v4l/by-id/usb-KYE_Systems_Corp._USB_Camera_200901010001-video-index0
[0:motion] [NTC] [ALL] [ 4月 19 23:39:] main: スレッドの終了を待っています、pid: 1445
[1:ml1:E] [NTC] [ALL] [ 4月 19 23:39:] motion_init: カメラ 1が開始しました:モーション検出 有効化
[1:ml1:E] [NTC] [VID] [ 4月 19 23:39:] vid_start: V4L2デバイスを開く

気づくのは日本語と英語。トランスレーションバグか…と思い早速ja.poを見てみるものの、さすがに"%b %d %H:%M:%S"を変換している部分はなかった。

なのでソース(src/logger.c)を見ていると…

static char *str_time(void)
{
    static char buffer[16];
    time_t now = 0;

    now = time(0);
    strftime(buffer, 16, "%b %d %H:%M:%S", localtime(&now));
    return buffer;
}

確かに英語圏では月の略称は3文字で「Apr 19 23:39:21」すが、その他の言語だと残念なことになりそうな気配。どんなコード形態で扱っているのは不明ですが、結果を見ると「 4月 19 23:39:」と2文字足りてないので「月」が結構容量食っている感じです(当社比2倍w)。

試しにバッファをおおきくしてリビルドしてみましょうかね。

static char *str_time(void)
{
// % b is not always 3 characters 16 -> 32
//static char buffer[16];
static char buffer[32];
time_t now = 0;

now = time(0);
//strftime(buffer, 16, "%b %d %H:%M:%S", localtime(&now));
strftime(buffer, 32, "%b %d %H:%M:%S", localtime(&now));
return buffer;
}

リビルド…どこからやればいいのかわからないので、make cleanから
autoreconf -fiv
./configure
make
make install

[0:motion] [NTC] [STR] [Apr 20 18:48:47] webu_start_strm: Starting camera 1 stream on port 8085
[0:motion] [NTC] [STR] [Apr 20 18:48:47] webu_strm_ntc: Started camera 1 stream on port 8085
[0:motion] [NTC] [STR] [Apr 20 18:48:47] webu_start_ctrl: Starting webcontrol on port 8080
[0:motion] [NTC] [STR] [Apr 20 18:48:47] webu_start_ctrl: Started webcontrol on port 8080
[0:motion] [NTC] [ENC] [Apr 20 18:48:47] ffmpeg_global_init: ffmpeg libavcodec version 58.91.100 libavformat version 58.45.100
[0:motion] [NTC] [ALL] [ 4月 20 18:48:47] translate_init: 言語:英語
[0:motion] [NTC] [ALL] [ 4月 20 18:48:47] motion_start_thread: カメラID: 1は /etc/motion/BSW20KM11BK.confから設定されています.
[0:motion] [NTC] [ALL] [ 4月 20 18:48:47] motion_start_thread: カメラID: 1カメラ名: Eデバイス: /dev/v4l/by-id/usb-KYE_Systems_Corp._USB_Camera_200901010001-video-index0
[0:motion] [NTC] [ALL] [ 4月 20 18:48:47] main: スレッドの終了を待っています、pid: 11880
[1:ml1:E] [NTC] [ALL] [ 4月 20 18:48:47] motion_init: カメラ 1が開始しました:モーション検出 有効化
[1:ml1:E] [NTC] [VID] [ 4月 20 18:48:47] vid_start: V4L2デバイスを開く 

はい、完了。
抜本的にはバグレポする必要がありそうだし、linuxのこの手の文字コードの手順ってどうするんでしょう?

と言うよりも、英語設定なのに日本語変換されているのが問題だったりするんだがw

2022年4月13日水曜日

motionの日本語ファイル

 4.4のビルド環境の手始めに、せっかくなので不自由そうな日本語ファイルを調整しました。

ビルドしたディレクトリに放り込んでリビルドするか、言語ファイルだけ個別に変換してインストールしたディレクトリに設置すると少しはまともになるかな?といった程度。

若干言葉の揺れや、一貫性が取れてない部分もありますがご了承ください。githubとか使ってないのでとりあえずドライブで共有化しておいたのでどうぞ

ja.zip

zipファイルですが言語ファイルはja.poで、最初の方にコメントで簡単な手順を示してあります。

motionで気になってる部分はwebコントロールページが新しくなってた(4.3ぐらいから?)のですが、日本語ファイルを外して英語にしてもパラメータの設定のコンボボックスに出てこないので起動や停止はできるのですが、パラメータを設定することが直接できませんでした。

動作自体は昔(4.1未満)のままで、パラメータ名も変更されてsyslogに警告文が大量に流れたりしますが、良くも悪くもそのままといった印象。ログを見るとかなりバグが解消されている感じはあるのですが…

2020年7月11日土曜日

再起動後、録画直後にmotionが落ちる

再起動した後、気づいたらカメラの動作ランプが消えていて、サービス無効化したっけか?とsudo service motion statusで確認すると、Activeの表示。(topとかでプロセスの状態を確認すればよかったかも…)問題がなさそうなので、ログを見てみることに。
/var/log/motion/motion.log
が存在していたので、起動したのは確実。理由はこのraspberry piはほとんどのlogはtmpなので再起動で消えてしまいます。
中身を見ると、確かに[ERR]がいくつかでててそこで終わっています。

特に考えもせずにsudo service motion restartで、motionを再起動。
そしてカメラを動作させて様子を見ると…普通に動いてます。ですよねぇ…今まで動いていたし。
思い起こせば、マスクをかけていたのを外したからムービーファイルが巨大になって落ちたのかな?とか。でもそんなことはないと思うのでちょっと納得いかない。

しばらく放置しても落ちそうになかったので、再度再起動してみる。
カメラの動作ランプが点灯して、motionを反応させて録画させてみると、保存のタイミングでカメラのランプが消えてしまいました。落ちたか…。
sudo service motion restartで再起動させて、しばらく様子を見ると普通に動作している感じです。
原因がさっぱりわかりません。

再度ログをみてみると、
[1:ml1:F] [NTC] [EVT] [Jul 11 01:38:03] event_newfile: File of type 8 saved to: /tmp/20200711013802F-01.avi
[1:ml1:F] [NTC] [ALL] [Jul 11 01:38:03] motion_detected: Motion detected - starting event 1
[1:ml1:F] [ERR] [ENC] [Jul 11 01:42:20] ffmpeg_avcodec_log: Too large number of skipped frames 235812 > 60000
[1:ml1:F] [ERR] [ENC] [Jul 11 01:42:20] ffmpeg_put_frame: Error while writing video frame: No such file or directory
[1:ml1:F] [NTC] [ALL] [Jul 11 01:42:20] preview_save: different filename or picture only!
[1:ml1:F] [NTC] [EVT] [Jul 11 01:42:20] event_newfile: File of type 1 saved to: /tmp/20200711013809F-01-01.jpg
[0:motion] [NTC] [ALL] [Jul 11 01:56:05] motion_startup: Using log type (ALL) log level (NTC)
[0:motion] [NTC] [ALL] [Jul 11 01:56:05] become_daemon: Motion going to daemon mode
設定は結構変なことをしていて、一旦tmpに動画を作らせてからそのあと保存用のディレクトリに移動させてたりするので、出力が/tmpになってたりします。

原因の一端にその辺もありそうですが、エラーメッセージで検索をかけたところ、
を見てみると、timelapse設定をオフにしてみると対処できるらしい。が、そんな機能使ってないんですが。
まぁそれはそれとしてmotion.confを見てみると、timelapse関連の設定は、

ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily

の2つありました。ffmpeg_timelapseが0なのでオフのはずなのですが、エラーメッセージから推測すると、ファイル名を変更しようとしているのでffmpeg_timelapse_modeも影響がありそうなので、
ffmpeg_timelapse_mode manual
と設定変更してみました。

変更後、とりあえず落ちることは無くなりました。





motion -hで表示されたバージョン情報
motion Version 4.0, Copyright 2000-2016 Jeroen Vreeken/Folkert van Heusden/Kenneth Lavrsen/Motion-Project maintainers

パッケージバージョン
4.0-1

2016年5月5日木曜日

motion@Raspberry pi

Raspberry pi 3を購入した大きな理由はmotionの動作がまともになるかもという期待からでした。

2012年7月9日月曜日

マスクファイルの設定

撮影カメラの角度を変えればいいのだけど扇風機を使ってると常に動いてるのでとめたいと思っていたのですがようやく設定してみました。

motionでマスク画像を用意してマスクを掛けれることは知っていたのですが実際にやるまでが遅い遅い(笑)

そんなわけで早速現在の画像を取ってきてマスクを作ろうと思ってマスクファイルの形式を見てみると、「PGM」ファイルという物が必要らしい。

ファイル形式は知りませんが、PGM : portable gray map と呼ばれるらしく、motionサイトのドキュメントにもありました。

http://www.lavrsen.dk/foswiki/bin/view/Motion/MotionGuideAlphabeticalOptionReferenceManual#mask_file

Linuxではdjpegなるコマンドで変換もできるようで試しにUbuntuで
djpeg -?
と実行したらヘルプが表示されました。手軽なところでCygwinで実行してみると…インストールされているようで同じく動きました。(openwrtのコンパイルはできなかったのですが、色々入れておいたのでようやく役に立った感じです)

同じページにコマンドも表示されているので
djpeg -grayscale -pnm mask.jpg > mask.pgm
と実行して出来上がったファイルを適当なディレクトリにコピーして/etc/motion.confをviなどで
mask_file /home/motion/mask.pgm
と設定してopenwrt再起動。
これで扇風機を動かしても記録されません(笑)

2012年6月19日火曜日

Motion用のビュワーを作成中

Motionで監視カメラを動作させ続けていますが今のところ全く問題はありません。
ただ、OpenWrtの配布形態のバイナリではMPEG変換がどうも行われないようなので再構築する必要がありそうです。

ですがどうもよく動作を理解していないので今のところWEB/PHPでとりあえず対応しています。

2つの環境で動作させているのですが、ルータではやはり処理能力が不足気味で画像も320×240で動作させて2FPS程度が限界のようです。(保存先をメモリーにすれば幾分早くなるのかもしれませんが必要以上のコマが必要とも思わないのでこれでいいのかなと。)

またファイル数が千単位に膨れ上がるとターミナルやSAMBA接続で厳しくなっているので今のところ月別のディレクトリの中にさらに日ごとに分けて保存するようにしています。
部屋で監視させているとだいたいこれで毎日2000~4000枚のJpeg画像が生成されています。

保存形態は当初から大体このような形で大丈夫かな?と言った程度です。(MPEG運用になればまた違った形になるかもしれませんが。

ざっとした雛形は1日で出来上がったのですが細かいところでいろいろと欲が出てきていていまのところサムネイル用の画像を作成させるかどうかで仕様を悩んでいるところです。

ppBlogで実感していたのですが、どうもルータに画像処理を行わせるとどうしても処理が重すぎてどうにもならない様でどうしたものかと。
PHPで画像ファイルを扱うのは非常に簡素化されているので工夫するにしても差ほど変わらないだろうというのが今のところの感触です。
たった320×240の画像から160×120のサムネイル画像(原画自体がサムネイルじゃないかと思いますけど(笑))を生成するのに処理してるのがわかるぐらい待たされました。
画像のリサイズを行う方法は2つあり、一つは全ピクセル情報をつかってのリサンプリングしリサイズを行う方法。もう一つは単純にピクセルを間引いてリサイズを行う方法。
WindowsXPのころからこの様な処理はどちらにしてもほとんどがハードウェアなどで処理されたりCPU自体の処理能力の向上によって体感速度はあまりかわらないものなのですが、ルータでは明らかに前者よりも単純に間引いてリサイズするほうが処理時間が短く済みます。
出来上がった画像は当然不自然にはなりますが処理時間とのトレードオフと考えれば十分考える余地があります。(このへんの処理もppBlogで手を加えると処理時間が短くサクサク動くようになるのかも?とかちょっと目論んでいますがどうなることやら(笑))