2016年2月10日水曜日

motionが保存する動画が早回しになる

追記1 : github上に点在していたmotionの改変版がまとまりつつあるようです。今後はこちらのバージョンがメジャーになっていくものと思われます。

https://motion-project.github.io/

motionという、webカメラの画像に移動検出をかけたり、動画として保存したり、ストリーミング配信できたりする便利なソフトウェアがあります。 LinuxなどのOSで動作するのでRaspberry piで利用されることも多いようです。

しかし、debianとUbuntu上の現在のバージョン(3.2.12+git20140228-4など)には、カメラのフレームレートが高い場合、動画に保存される画像が毎秒3枚分に制限されてしまい、にもかかわらず動画のフレームレートにはカメラのフレームレートが設定されるという挙動が存在します。

この挙動の結果、カメラからの画像がほとんど保存されず、早回しの動画になってしまいます。

原因

これは、カメラのフレームレートが高速である場合に移動検出を毎秒3枚までに制限する機能の副作用によって発生しています。おそらく、設計時に意図されていたものとは異なる挙動であると考えられるので、バグの可能性があります。

対処

この問題はmotion内部の画像を保存するリングバッファーのサイズが1の場合に発生するようです。

従って/etc/motion/motion.confで、

  • pre_captureを1以上
  • minimum_motion_framesを2以上
のいずれかを設定することでこの挙動を抑制することができます。

また、この問題を発生させている部分を特定できたので、debian上のmotion_3.2.12+git20140228-4の場合、以下のパッチを適用することでこの挙動を抑制することができます。ただし、私の利用する範囲内での動作しか確認できていないため、他の問題を引き起こす可能性があります。

--- a/motion.c
+++ b/motion.c
@@ -1294,7 +1294,7 @@ static void *motion_loop(void *arg)
                 cnt->current_image->timestamp_tm = old_image->timestamp_tm;
                 cnt->current_image->shot = old_image->shot;
                 cnt->current_image->cent_dist = old_image->cent_dist;
-                cnt->current_image->flags = old_image->flags;
+                cnt->current_image->flags = 0;
                 cnt->current_image->location = old_image->location;
                 cnt->current_image->total_labels = old_image->total_labels;
             }

github上にはこの問題を修正した上で、さらに機能が追加されたmotionも公開されているので、そちらを利用するのも良いかもしれません。