====== インターネットカメラで動体検知録画 ====== ===== やりたいこと ===== * インターネットカメラで提供される映像のうち、動きのある部分だけを録画したい * 録画したデータは長期保存(3年ぐらい)したい ===== 課題 ===== * インターネットカメラはクラウドサービスとして提供される。映像を確認するにはブラウザで管理画面にログインし、ライブ映像もしくは録画済みデータの再生を行う必要がある。 * 録画済みデータがクラウド上に保持される期間は短期(7日、14日などサービスレベルで異なる)で古いものから削除される。 * 録画済みデータのダウンロードはできるが、1時間で400MB程度ある。 * ダウンロード操作はブラウザからのみで、バッチ処理はできない。 * 保持期間が短期であるため、過去分の確認を行うには予め録画済みデータのダウンロードを行っておく必要がある。 * 24時間録画であるため、動きのある部分を探すためには早送り再生での目視確認や[[http://www.av2video.com/|Video Remove No-Movement Free]]等で動きのある部分の抽出作業が必要。 * 目視確認はせいぜい倍速が限度 * 動きのある部分の抽出は1時間分の録画データに対して、15〜20分かかる。 ===== 試したこと ===== * [[http://www.av2video.com/|Video Remove No-Movement Free]]で動きのある部分を抽出 * 1時間 400MBの録画済みデータの処理で 20分程度かかる。 * 録画済みデータを [[https://motion-project.github.io/index.html|Motion]] で動体検知処理 * 1時間 400MBの録画済みデータの処理で 1時間以上かかる。 上記より、録画済みデータに対して処理を行うことは現実的ではないと判断した。 ===== 解決策 ===== * ブラウザでインターネットカメラのライブ映像を表示したままする。 * このブラウザを起動している画面自身を動体検知処理し、動きのある時だけ録画する。 * インターネットカメラの映像を直接ではなく、ライブ映像を表示したブラウザを動体検知処理の対象とする ===== 構成概要 ===== * Ubuntu Server で VNC serverを立ち上げる。 * VNC上でブラウザを開き、インターネットカメラのライブ映像を表示する。 * ffmpeg で x11grab を使用し、画面を v4l2loopback である /dev/video0 へ出力する。 * Motion で入力ソースを /dev/video0 として、動体検知時に録画する。 ===== 設定 ===== ==== Ubuntu Server ==== Ubuntu Server に GUI環境を作る。 参考元[[https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-20-04-quickstart|How to Install and Configure VNC on Ubuntu 20.04 [Quickstart]]] - XFCE4 導入 $ sudo apt update $ sudo apt-get install xfce4 xfce4-goodies - VNC 導入 $ sudo apt-get install tightvncserver - VNC 初期設定 $ vncpasswd You will require a password to access your desktops. Password: Verify: - $HOME/.vnc/xstartup 作成 #!/bin/bash xrdb $HOME/.Xresources startxfce4 & - 実行権付与 chmod +x ~/.vnc/xstartup - VNC をサービス登録する $ sudo vi /etc/systemd/system/vncserver@.service [Unit] Description=Start TightVNC server at startup After=syslog.target network.target [Service] Type=forking User=<ユーザ名> Group=<グループ名> WorkingDirectory=/home/<ユーザ名> PIDFile=/home/<ユーザ名>/.vnc/%H:%i.pid ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i ExecStop=/usr/bin/vncserver -kill :%i [Install] WantedBy=multi-user.target - 追加した Unit を認識させる $ sudo systemctl daemon-reload - 追加した Unit を有効化する $ sudo systemctl enable vncserver@1.service - 一度リブートする - 外部から ssh で接続する $ ssh -f -L 59000:localhost:5901 -C -N -l <ユーザID> -i <秘密鍵> - vncviewer などで接続しデスクトップが表示されることを確認する vncviewer :59000 ==== Chrome ==== Chrome を導入する。 - インストラーラ取得 $ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - インストール $ sudo apt-get install ./google-chrome-stable_current_amd64.deb ==== ffmpeg ==== ffmpeg を導入する。 - ffmpeg インストール $ sudo apt-get install ffmpeg ==== Motion ==== Motion を導入する。 参考元[[https://motion-project.github.io/motion_build.html|Installing and Building from Source]] - Motion インストール $ sudo apt-get install motion - 関連ライブラリインストール $ sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libavdevice-dev $ sudo apt-get install libjpeg-turbo8 libjpeg-turbo8-dev - v4l2loopback インストール $ sudo apt-get install v4l2loopback-dkms - OS起動時に v4l2loopback が組み込まれるよう設定する $ sudo vi /etc/modules-load.d/modules.conf v4l2loopback * OS再起動後、lsmod | grep v4l2 でロードされていることを確認する * /dev/video0 があることを確認する - VNC で接続するユーザが /dev/video0 を使えるようにするため、ユーザを video グループに追加する。 $ sudo usermod <ユーザ> -G video -a ==== motion.conf ==== - /etc/motion/motion.conf を ~/にコピーして編集する。 ; log_file /var/log/motion/motion.log # ログを取らない target_dir /home/<ユーザ> # 保存場所をユーザがアクセス権を持つ場所へ変更 netcam_url v4l2:///dev/video0 # ffmpeg のキャプチャデータが /dev/video0 に出力されるので、それをカメラソースにする width 1280 # VNC のサイズと同じにする height 800 # VNC のサイズと同じにする framerate 15 # ffmpeg のフレームレートと同じにする ;text_left CAMERA1 # 録画映像に [CAMERA 1] などの説明をオーバレイしない ;text_right %Y-%m-%d\n%T-%q # 録画映像に録画時刻をオーバーレイしない post_capture 45 # 動きがなくなった後、何フレーム追加で録画するか threshold_tune on # 動体検知しきい値の自動調整 movie_max_time 0 # 動体検知後の録画打ち切り時間を 0 (打ち切らない)にする movie_codec mp4 # 録画映像のフォーマットを mp4 にする movie_filename %Y%m%d%H%M%S # 録画映像のファイル名を設定する ===== 録画方法 ===== - 外部から ssh で接続する (例) $ ssh -f -L 59000:localhost:5901 -C -N -l <ユーザID> -i <秘密鍵> - vncviewer などで接続する (例) vncviewer :59000 - VNC 接続後、ターミナルなどを起動しデスクトップ画面の録画を開始する $ ffmpeg -f x11grab -draw_mouse 0 -video_size 1280x800 -framerate 15 -i :1.0 -f v4l2 /dev/video0 * -f x11grab * デスクトップを録画channel 2: open failed: connect failed: Connection refused * -draw_mouse 0 * XFce4 の場合、このオプションがないと真っ黒な画面しかキャプチャできない * -video_size * vncserver で設定した画面サイズと同じにする * -i :1.0 * $DISPLAY でも可 * -f v4l2 /dev/video0 * 録画したデータを /dev/video0 に出力する - Motion を起動する $ motoin -c motion.conf - ブラウザを起動し、インターネットカメラのライブ画像をフルスクリーン表示する - VNC接続とVNC用の ssh 接続は切断可能