aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

RTSPからintdashに動画をアップロードしてみた

aptpod Advent Calendar 2023 12月8日の記事です

入社1ヶ月目のソリューションアーキテクトの奥山です。まだまだペーペーの私ですが、よろしくお願いいたします。 毎日がキャッチアップの連続で頑張っています。この記事では、intdashとはなんぞやから、実際に家にあるものでintdashを変に試しつつ、覚えたての知識をOutputしてみようというものです。

僕はいろんなガジェットを試しては壊し、試しては壊しを繰り返して遊んでいるせいか、最近どうやら物価高の影響で(先月のブラックフライデーもあり)引き落とし額がえらいことになっていました。そんな僕に優しく微笑んでくれたのが格安高性能カメラATOM Cam2です。さぁ、壊して学ぶ時間です。(注:壊したりはしません)

ATOM Cam2とは

ATOM Cam2はAIカメラです。なんとこのカメラ、単体クローズドでモーション検知やらいろいろ機能がついていて、IP67で、それでいて4000円弱という素晴らしいカメラなんですね。(下記の写真左側です) お財布事情が寂しい僕としては、とてもありがたいガジェットです。玄関に監視カメラ用途でつけておくという使い方もできそうです。

そしてふと思いました。このATOM Cam2をintdashに接続できないかと、、、 ってことでやってみることにしました。

intdashとは

おそらく、この記事を見ている方はintdashはすでに知っているという人の方が多いかもしれませんが、僕のお勉強にお付き合いください。

intdash

  • 低遅延、高スループット
  • 完全性(データ回収率100%)
  • データフォーマットの多様性
  • 時系列データ
  • スケーラビリティ
  • 開発部品のパッケージ化による開発容易性

簡単に言うと、取説を見て取説通りにやればIoT化ができ、しかもデータ完全性など独自検討しなければならない部分もすでに実装済みで至れり尽くせりという素敵仕様なIoTプラットフォームです。 AWS IoTなどで構築すると、カメラをクラウドアップロードするだけでも学習コストが発生する上、よく性質を理解した上で取り扱わなければなりません。intdashを使うとUSBカメラからのアップロードと可視化が学習コストほぼ無く作れてしまうという優れものです。 UIのセンスが無い僕としてはありがたい存在です。

実際にやってみた

全体像

まずは、全体像です。

ATOM Cam2側の設定

  1. 最初にATOM Cam2をユーザーマニュアルの通りにセッティングします。
  2. Atomアプリの対象カメラの<設定>-><その他>-><PCで再生>をONにします。
  3. 表示される"rtsp://~"のURLをコピーしておきます。

ラズパイ側の設定

  1. ラズパイには、ubuntu:22.04をインストールしました。rasbianOSでも良いのですが、dockerの設定などの手間暇があるので、intdashのシステム要件に合わせました。
  2. intdashのインストールは、ここを参照してインストール作業を行います。

ATOM Cam2から動画をintdashへ出力してみる

まずは、仮想カメラデバイスを作成するために、v4l2loopbackをインストールします。そして、RTSP送信データを仮想カメラデバイスに転送するためのffmpegも同時にインストールします。

sudo apt-get install -y v4l2loopback-dkms ffmpeg

ターミナルを2つひらいて、一つは以下のコマンドを実行します。

sudo modprobe v4l2loopback video_nr=0
ffmpeg -rtsp_transport tcp -r 20 -i <ATOM Cam2のRTSP URL> -vf "scale=640:360" -f v4l2 -vcodec mjpeg /dev/video0

v4l2loopbackで/dev/video0という仮想カメラデバイスを作成します。 その後、ffmpegでRTSPをこの仮想カメラデバイスに動画を転送します。 この時、RTSPを送信しているATOM Cam2が非力であるため、うまくデータが送られて来ない可能性があります。そのため、できる限りスケールを下げておくことをお勧めします。

もう一つのターミナルではconf.yamlファイルを作成し、intdashを起動します。

tasks:
  - id: 1
    element: v4l2-src
    conf:
      path: /dev/video0
      type: jpeg
      width: 640
      height: 360
      fps: 20

  - id: 2
    element: jpeg-split-filter
    from: [[ 1 ]]

  - id: 3
    element: iscp-v2-compat-filter
    from: [[ 2 ]]
    conf:
      timestamp:
        stamp:
          clock_id: CLOCK_MONOTONIC
      convert_rule:
        jpeg:
          name: "jpeg"
- id: 4
    element: print-log-filter
    from: [[ 3 ]]
    conf:
      interval_ms: 1000
      tag: video0
      output: stderr

  - id: 5
    element: file-sink
    from: [[ 4 ]]
    conf:
      path: /var/run/intdash/up-hello.fifo
      create: true
      flush_size: 100
sudo intdash-agentctl config connection --modify '
    server_url: https://XXXXXX.intdash.jp
    project_uuid: XXXXXXXXXXXXXXXX
    edge_uuid: XXXXXXXXXXXXXXXXXXXX
    client_secret: XXXXXXXXXXXXXXXXXXXXXXXXX
  '

sudo intdash-agentctl config upstream -c '
    id: sample-upstream
  '

sudo intdash-agentctl config device-connector upstream --create '
    id: up-hello
    data_name_prefix: v1/1/
    dest_ids:
      - sample-upstream
    format: iscp-v2-compat
    ipc:
      type: fifo
      path: /var/run/intdash/up-hello.fifo
    launch:
      cmd: device-connector-intdash
      args:
      - --config
      - <conf.yamlのfull path>
  '

sudo intdash-agentctl run

XXXXは、それぞれの環境に合わせて設定します。

これにより、以下のようにintdashに動画がアップロードされていることを確認することができました。

ちなみにATOM Cam2は、Edge側でモーションを検知し、画像として出力しているため、下記のようにモーションを検知したところに緑枠が入ります。

まとめ

  • ATOM Cam2とintdashは頑張れば接続できる。(やろうと思えばカメラはなんでも繋がる)
  • ATOM Cam2はRTSP機能はおまけ機能なので、速度は期待しない方がいい。タイムラグはかなり発生する。
  • 画像を小さくリサイズすればなんとか動く。(画像サイズが大きいとffmpegが停止する。おそらくバッファサイズ大きくすれば良いのかも)
  • モーション検知してもRTSPだとクライアントになにか通知されるわけではない。