====== インターネットカメラで動体検知録画 ======
===== やりたいこと =====
* インターネットカメラで提供される映像のうち、動きのある部分だけを録画したい
* 録画したデータは長期保存(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 接続は切断可能