User Tools

Site Tools


Sidebar

unclassified:delegatge_02

インターネットカメラで動体検知録画

やりたいこと

  • インターネットカメラで提供される映像のうち、動きのある部分だけを録画したい
  • 録画したデータは長期保存(3年ぐらい)したい

課題

  • インターネットカメラはクラウドサービスとして提供される。映像を確認するにはブラウザで管理画面にログインし、ライブ映像もしくは録画済みデータの再生を行う必要がある。
  • 録画済みデータがクラウド上に保持される期間は短期(7日、14日などサービスレベルで異なる)で古いものから削除される。
    • 録画済みデータのダウンロードはできるが、1時間で400MB程度ある。
      • ダウンロード操作はブラウザからのみで、バッチ処理はできない。
    • 保持期間が短期であるため、過去分の確認を行うには予め録画済みデータのダウンロードを行っておく必要がある。
  • 24時間録画であるため、動きのある部分を探すためには早送り再生での目視確認やVideo Remove No-Movement Free等で動きのある部分の抽出作業が必要。
    • 目視確認はせいぜい倍速が限度
    • 動きのある部分の抽出は1時間分の録画データに対して、15〜20分かかる。

試したこと

  • Video Remove No-Movement Freeで動きのある部分を抽出
    • 1時間 400MBの録画済みデータの処理で 20分程度かかる。
  • 録画済みデータを Motion で動体検知処理
    • 1時間 400MBの録画済みデータの処理で 1時間以上かかる。

上記より、録画済みデータに対して処理を行うことは現実的ではないと判断した。

解決策

  • ブラウザでインターネットカメラのライブ映像を表示したままする。
  • このブラウザを起動している画面自身を動体検知処理し、動きのある時だけ録画する。
    • インターネットカメラの映像を直接ではなく、ライブ映像を表示したブラウザを動体検知処理の対象とする

構成概要

  • Ubuntu Server で VNC serverを立ち上げる。
  • VNC上でブラウザを開き、インターネットカメラのライブ映像を表示する。
  • ffmpeg で x11grab を使用し、画面を v4l2loopback である /dev/video0 へ出力する。
  • Motion で入力ソースを /dev/video0 として、動体検知時に録画する。

設定

Ubuntu Server

Ubuntu Server に GUI環境を作る。

参考元How to Install and Configure VNC on Ubuntu 20.04 [Quickstart]

  1. XFCE4 導入
    $ sudo apt update
    $ sudo apt-get install xfce4 xfce4-goodies
  2. VNC 導入
    $ sudo apt-get install tightvncserver
  3. VNC 初期設定
    $ vncpasswd
    You will require a password to access your desktops.
    
    Password:
    Verify:
  4. $HOME/.vnc/xstartup 作成
    #!/bin/bash
    xrdb $HOME/.Xresources
    startxfce4 &
  5. 実行権付与
    chmod +x ~/.vnc/xstartup
  6. 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
  7. 追加した Unit を認識させる
    $ sudo systemctl daemon-reload
  8. 追加した Unit を有効化する
    $ sudo systemctl enable vncserver@1.service
  9. 一度リブートする
  10. 外部から ssh で接続する
    $ ssh -f -L 59000:localhost:5901 -C -N -l <ユーザID> -i <秘密鍵> <Ubuntu Server IP>
  11. vncviewer などで接続しデスクトップが表示されることを確認する
    vncviewer :59000

Chrome

Chrome を導入する。

  1. インストラーラ取得
    $ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
  2. インストール
    $ sudo apt-get install ./google-chrome-stable_current_amd64.deb

ffmpeg

ffmpeg を導入する。

  1. ffmpeg インストール
    $ sudo apt-get install ffmpeg

Motion

Motion を導入する。

参考元Installing and Building from Source

  1. Motion インストール
    $ sudo apt-get install motion
  2. 関連ライブラリインストール
    $ sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libavdevice-dev
    $ sudo apt-get install libjpeg-turbo8 libjpeg-turbo8-dev
  3. v4l2loopback インストール
    $ sudo apt-get install v4l2loopback-dkms
  4. OS起動時に v4l2loopback が組み込まれるよう設定する
    $ sudo vi /etc/modules-load.d/modules.conf
    v4l2loopback
    • OS再起動後、lsmod | grep v4l2 でロードされていることを確認する
    • /dev/video0 があることを確認する
  5. VNC で接続するユーザが /dev/video0 を使えるようにするため、ユーザを video グループに追加する。
    $ sudo usermod <ユーザ> -G video -a

motion.conf

  1. /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              # 録画映像のファイル名を設定する

録画方法

  1. 外部から ssh で接続する
    (例)
    $ ssh -f -L 59000:localhost:5901 -C -N -l <ユーザID> -i <秘密鍵> <Ubuntu Server IP>
  2. vncviewer などで接続する
    (例)
    vncviewer :59000
  3. 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 に出力する
  4. Motion を起動する
    $ motoin -c motion.conf
  5. ブラウザを起動し、インターネットカメラのライブ画像をフルスクリーン表示する
  6. VNC接続とVNC用の ssh 接続は切断可能
unclassified/delegatge_02.txt · Last modified: 2020/07/12 22:53 by hoge@hoge