enebular AWS IoT agent を使用してラズパイのマルチモニター環境を制御してみた。


はじめに

ラズパイで TCPSClient (INetSyphon) を用いてマルチモニター環境を構築してみた。
マルチモニターの映像構成や映像配信元 (TCPSyphonServer または TCPSpoutServer) を簡単に切り替えられるようにするため、ラズパイ上の TCPSClient を enebular AWS IoT agent を用いて制御 (コントロール) してみた。

きっかけ

IoTLT 放送部の活動で OBS-NDI というプラグインを使用してネットワークを介して他の PC の映像を中継して配信することが可能だということが分かった。

  • NDI: Network Device Interface
    NewTek 社によって開発された複数の映像システムを IP ネットワークを介して双方向にやり取りすることができ、リアルタイムに大量の高品質、低遅延かつ高フレーム精度でエンコードし、ビデオ制作ワークフロー支援プロトコル。SDK が無償で配布されています。

NDI SDK を調べていくと異なる VJ ソフトウェア間で映像の共有・連携をする際に Mac では Syphon 、Windows では Spout が使用されることが分かった。また、Syphon、Spout は共有メモリを介したプロセス間通信で映像を取得するため、NDISyphonSpout to NDI のツールを使用してネットワークを介して映像を共有・連携をすることが分かった。例えば、VDMX5 は無償版では設定を保存できない制限があるが、フル機能 (NDI/Syphon) を使用可能であるが、TouchDesigner は無償版 (Non-Commercial) だと NDI In/Out TOP が使用できないので、Syphon Spout In/Out TOP と NDISyphon や Spout to NDI のツールを組み合わせると同じことが実現できる。


調べていく過程で、過去に TCPSyphonTCPSpout という同じ目的の取り組みが存在することが分かった。こちらは Syphon、Spout を TurboJPEG に変換してネットワークを介して映像を共有・連携する仕組みである。(TCPSyphon という名前は INetSyphon に改められている)
現在、ツールの配布は終了しているようだが、まだ直接ダウンロードできるので URL を残しておく。
https://mypage.techlife.sg/products/TCPSyphon.zip
https://mypage.techlife.sg/products/TCPSpout.zip

また、TCPSyphon、TCPSpout を受信できるライブラリとして SDK が公開されており、ラズパイでも受信できるツール TCPSClient も公開されている。TCPSClient はトリミング(部分表示)機能を持っているため、部分表示するラズパイを複数組み合わせることでマルチモニター環境を構築できることが分かった。(参考)

※ NDI SDK は ラズパイ等の ARM ライブラリでは送信は対応しているが、受信は対応していない。(NDI SDK Documentation.pdfより抜粋)

構成

例えば、ラズパイ 4 台で 1 つの映像を表示するマルチモニター環境を構築する場合、各ラズパイ上の TCPSClient は以下の引数を指定して起動する。

# ① 配信元の画像の左上1/4を表示
$ TCPSClient.bin -s 0,0,0.5,0.5 -d 0,0,1920,1080
# ② 配信元の画像の右上1/4を表示
$ TCPSClient.bin -s 0.5,0,1,0.5 -d 0,0,1920,1080
# ③ 配信元の画像の左下1/4を表示
$ TCPSClient.bin -s 0,0.5,0.5,1 -d 0,0,1920,1080
# ④ 配信元の画像の右下1/4を表示
$ TCPSClient.bin -s 0.5,0.5,1,1 -d 0,0,1920,1080

また、映像配信元 (TCPSyphonServer または TCPSpoutServer) を切り替える場合は以下の引数を指定して起動する。

$ TCPSClient.bin -c [映像配信元のIPアドレス] -p [映像配信元のポート番号]

複数のラズパイ上の TCPSClient を簡単に制御できるようにするため、enebular editor でフローを作成し、enebular AWS IoT agent を使用してフローをデプロイする。

手順

1. Raspberry Pi を AWS IoT に繋いで enebular と連携

以下のページを参照して enebular AWS IoT agent をインストールする。
https://qiita.com/TakedaHiromasa/items/b6828e4ac434bf99325d

enebular-runtime-agent(公式) のインストールスクリプトを実行して、AWS IoT 上にモノ (管理) と証明書 (安全性) が追加されることを確認する。

$ ssh -t pi@[ラズパイの IP アドレス] \
"wget -qO- https://raw.githubusercontent.com/enebular/enebular-runtime-agent/master/tools/install/install.sh | sudo -E bash -s -- \
--aws-iot-thing-name=[モノの名前] \
--aws-access-key-id=[AWS Access Key ID] \
--aws-secret-access-key=[AWS Secret Access Key] \
--aws-iot-region=[Region]"

[AWS Access Key ID] と [AWS Secret Access Key] は AWS IoT 用 IAM ユーザーを作成した際に取得するアクセスー ID とシークレットアクセスキーを設定する。
下記の例では [モノの名前] は

  • enebular-test-01
  • enebular-test-02
  • enebular-test-03
  • enebular-test-04

[Region] は

  • ap-northeast-1 (アジアパシフィック(東京))

で作成した。

2. TCPSClient for Raspberry Pi をインストール

ラズパイへ SSH でログインして、以下のコマンドを実行する。

# pi ユーザで実行
$ sudo apt-get install libavahi-compat-libdnssd-dev

# enebular ユーザで実行
# $ sudo su - enebular
$ git clone https://github.com/z37soft/INetSyphon_RaspberryPi_SDK
$ cd INetSyphon_RaspberryPi_SDK/RaspberryPi3_Stretch/
$ chmod +x TCPSClient.bin
$ cp TCPSClient.bin ~/

3. video グループに enebular ユーザを追加

enebular ユーザで TCPSClient.bin が起動されるため、video グループに enebular ユーザを追加する。

$ sudo gpasswd -a enebular video

4. enebular agent を enebular editor と連携

enebular editor からラズパイ上のフローの動作を確認したり、フローを操作する場合、enebular agent を —dev-mode オプション付きで起動する必要がある。
/etc/systemd/system/enebular-agent-enebular.service
を変更して —dev-mode オプションを追加する。
ExecStart=/home/enebular/enebular-runtime-agent/ports/awsiot/bin/enebular-awsiot-agent --enable-syslog --daemon-mode
 ↓
ExecStart=/home/enebular/enebular-runtime-agent/ports/awsiot/bin/enebular-awsiot-agent --enable-syslog --daemon-mode --dev-mode

# 上記の変更
$ sudo vi /etc/systemd/system/enebular-agent-enebular.service

# 設定を反映
$ sudo systemctl daemon-reload

# プロセスを再起動
$ sudo systemctl restart enebular-agent-enebular

# ログを確認 (省略可)
$ sudo journalctl -ex -u enebular-agent-enebular.service

5. enebular editor でフローを作成

デスクトップを選択してフローを作成する。

ブラウザからアクセスすると TCPSClient が起動・停止するフローを作成する。(括弧内はアクセス先の URL)

  • 全画面表示 (http://[ラズパイの IP アドレス]:1880/on)
  • ①配信元の画像の左上1/4を表示 (http://[ラズパイの IP アドレス]:1880/1)
  • ②配信元の画像の右上1/4を表示 (http://[ラズパイの IP アドレス]:1880/2)
  • ③配信元の画像の左下1/4を表示 (http://[ラズパイの IP アドレス]:1880/3)
  • ④配信元の画像の右下1/4を表示 (http://[ラズパイの IP アドレス]:1880/4)
  • 停止 (http://[ラズパイの IP アドレス]:1880/off)

※ ニーズがあるかどうか分かりませんが、enebular でフローを公開しておきます。(´・ω・`)
 https://enebular.com/discover/flow/47b455f5-f4c1-4ca4-94af-267ae9b61705

6. enebular editor でフローをラズパイへデプロイ

デプロイを選択してフローをラズパイへ配信する。

7. enebular editor の編集 (リモート) でフローの動作を確認 (省略可)

enebular agent を —dev-mode オプション付きで起動すると enebular editor からフローを編集できる。ラズパイ上の動作を確認したり、フローのデバッグ情報を確認する場合に使用する。

まとめ

マルチモニター環境を構築する製品に Triplehead2GoDatapath X4 がありますが、ラズパイを使用して安価・簡易に構築してみました。また、enebular AWS IoT agent と enebular editor を使用して画面構成を操作できるようにしてみました。
みなさんも 良き enebular AWS IoT ライフを!

(追伸: nrgpio のエラー対処方法)
journalctl コマンドで enebular agent のログを確認すると起動時にエラーが出力されていることが確認される。Node-REDから GPIO ピンを制御する場合に使用される rpi-gpio nodes です。

$ sudo journalctl -ex -u enebular-agent-enebular.service
・・・
service.node-red: 30 Dec 11:07:05 - [error] /home/enebular/enebular-runtime-agent/node-red/node_modules/@uhuru/enebular-node-red/nodes/core/hardware/nrgpio needs to be executable
service.node-red: 30 Dec 11:07:09 - [warn] ------------------------------------------------------
service.node-red: 30 Dec 11:07:09 - [warn] [node-red/rpi-gpio] Error : nrgpio must to be executable
service.node-red: 30 Dec 11:07:09 - [warn] ------------------------------------------------------
・・・

エラーを解消するためには nrgpio ファイルに実行権限を付与し、改行コードを変更する必要がある。Windows(CRLF) → Unix(LF)

$ chmod +x /home/enebular/enebular-runtime-agent/node-red/node_modules/@uhuru/enebular-node-red/nodes/core/hardware/nrgpio
$ sed -i.bak 's/'$'\r//' /home/enebular/enebular-runtime-agent/node-red/node_modules/@uhuru/enebular-node-red/nodes/core/hardware/nrgpio