0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WEBカメラのURLがわかればコマンド一つで録画できるアプリ作ってみた

Posted at

動機

監視カメラで録画した動画を差分検知をする必要があったんですがネット上には作ってみた、やってみた系しかなく、簡単に解析、録画できるアプリが欲しいと思い作成しました。

前提条件

  • docker composeがインストールされていること
  • もしくはpoetryが実行できる環境であること

dockerの内容はpoetry環境をラップしているだけです。

アプリ

webcamrecorder

使い方

README.mdに書いてみましたが日本語でも書いてみます。

  1. git cloneする
  2. .env.exampleを.envにリネーム
  3. .env内のWEBCAMERA_URLを録画したいWEBカメラのものにする
  4. 以下のコマンドをディレクトリ内で実行
docker compose run webcamrecorder record

これでstoreディレクトリに動画が保存されます。

設計図

コンテキストモデル

入力源として動画とWEBカメラを考えています。
出力としては録画した動画と差分検知した部分を抜き出した動画を考えています。
差分検知した際に通知する機能としてとりあえずメールを用意しました。

定期実行はosの仕組みに任せます。
24時間動かし続ける場合はdocker-compose.ymlにてrestart: alwaysとかにすれば不活監視しなくても良い気がします。

クラス図

・集約

  • Frame(動画やWEBカメラの1フレーム)
  • WebcameraSource(WEBカメラの入力源)
  • VideoSource(動画の入力源)
  • MailSender(SMTPメーラー)

・ファーストクラスコレクション

  • FrameQueue(フレームのリスト管理)

・ユースケース

  • IContinuousRecording(常時録画)
  • IEventRecording(差分検知録画)
  • ITimerRecording(常時録画。指定した分数でアプリ終了)
  • ITimerEventRecording(差分検知録画。指定した分数でアプリ終了)
  • ISendMail(メール送る)
  • IDetectMotion(差分検知する)
  • IAnalyzeVideo(動画を解析する)

で考えました。ユースケースはDIしてるので差替え容易です。
IDetectMotion(差分検知する)は使うカメラや検知したい内容によって大きく変わるので各々が調整する必要がありそうです。

詳しい使い方

コマンドは以下の5つを用意しました。

record

常時録画です。以下のコマンドで起動します。

docker compose run webcamrecorder record

もしくはdocker-compose.ymlを以下のように書き換えて

docker-compose.yml
version: '3.7'
services:
  webcamrecorder:
    build: .
    container_name: "webcamrecorder"
    user: root
    restart: always
    volumes:
      - .:/webcamrecorder
      - ${COMPOSE_SAVE_PATH}:/webcamrecorder/store
    working_dir: /webcamrecorder
    entrypoint: poetry run python3 -m webcamrecorder
    command: record
docker compose up -d

を実行するとパソコンの電源が落ちたりアプリが異常終了しても録画を再開します。

.envで関係する変数は以下の通りです。

name explanation default value
WEBCAMERA_URL webcameraのurl. rtsp://user:password@ip:port/xxx.sdp
WEBCAMERA_FPS webcameraのfps 24
WEBCAMERA_OUTPUTFILENAME 出力するファイル名のサフィックス。./storeに出力されます。ファイル名は${WEBCAMERA_OUTPUTFILENAME}_yyyymmddhhmmss.mp4 になります。 webcam1
WEBCAMERA_RECORD_MINUTES 分単位で録画する分数を設定します。 10

event

WEBカメラで差分を検知したら一定フレーム録画します。以下のコマンドで起動します。

docker compose run webcamrecorder event

常時監視するならばrecordと同じようにすれば良いでしょう。

.envで関係する変数は以下の通りです。

name explanation default value
WEBCAMERA_URL webcameraのurl. rtsp://user:password@ip:port/xxx.sdp
WEBCAMERA_FPS webcameraのfps 24
WEBCAMERA_OUTPUTFILENAME 出力するファイル名のサフィックス。./storeに出力されます。ファイル名は${WEBCAMERA_OUTPUTFILENAME}_yyyymmddhhmmss.mp4 になります。 webcam1
N_FRAME_BEFORE_DETECTED 検知して何フレーム前から録画を開始するか設定します。遡れば遡るほどメモリを食うので機器と相談して値を決めます。 100
N_FRAME_AFTER_DETECTED 検知して何フレーム目まで録画するかを設定します。指定した範囲内でまた検知したらその時点から数え直します。 300

メールを送るなら以下の設定も必要です。

name explanation default value
SMTP_SERVER_ADDRESS smtp serverのaddress smtp.gmail.com
SMTP_PORT smtpのport 465
SMTP_ACCOUNT smtpのaccount user@gmail.com
SMTP_PASSWORD smtpのpassword password
MAIL_INTERVAL_MINUTES メールを送ってから次を送るまでの間隔を指定します。たくさん検知してたくさんメールが送られてくるのを防ぎます。 1
MAIL_SUBJECT mailの題名 subject
MAIL_BODY mailの本文 body

timer

指定した時間だけ録画してアプリを終了します。タスクスケジューラなどで定期実行する際に使用するイメージです。

docker compose run webcamrecorder timer

.envはrecordと同じです。WEBCAMERA_RECORD_MINUTES分録画したら終了します。

timerevent

指定した時間だけ監視してアプリを終了します。タスクスケジューラなどで定期実行する際に使用するイメージです。

docker compose run webcamrecorder timerevent

.envはeventに加えて以下の設定を使います。

name explanation default value
WEBCAMERA_RECORD_MINUTES 分単位で録画する分数を設定します。 10

video

録画済みの動画から差分検知して動画を抜き出すために使用します。

docker compose run webcamrecorder video --path store/***.mp4

--pathで動画ファイルを指定します。解析したい動画はstoreに格納してから実行したほうが良いでしょう。

name explanation default value
N_FRAME_BEFORE_DETECTED 検知して何フレーム前から録画を開始するか設定します。遡れば遡るほどメモリを食うので機器と相談して値を決めます。 100
N_FRAME_AFTER_DETECTED 検知して何フレーム目まで録画するかを設定します。指定した範囲内でまた検知したらその時点から数え直します。 300

終わりに

とりあえず自分が所持しているWEBカメラ(rtsp)では動作しました。
元はopencvなのでhttp指定でも動作するような気はしてます。
自分は今後は日中の時間だけ差分検知するために使用しようと思います。

しかし録画アプリって以下の変数で動作が大きく変わるため一般化は難しいとも思いました。

  • 使用するカメラ
  • 動画の解像度。fps
  • アプリを動作させる機器のマシンパワー
  • カメラと機器の間のネットワーク環境
  • 検知する方法とか画面のどこをマスクするかとか

pythonも今回本格的に触ってみたのですがコマンドアプリを作るのがとても楽でした。
インタプリタ言語でアプリを作る際は採用しようと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?