Skip to content

Repository files navigation

booth-display

LG Display製 LD290EJS-FPN1 (1920x540) を使用した連接ブースディスプレイを制御・同期表示するためのコントローラシステムです。

Web-GUIを内包したスタンドアロン単一バイナリとして動作し、全体仮想キャンバスの映像をディスプレイごとにクロップ分割して低遅延UDP (H.264 Annex-B) で同時送出します。

詳細なアーキテクチャやプロトコル仕様は docs/ を参照してください。

必要要件

  • OS: Linux (Debian 12+, Ubuntu 22.04+, Fedora 39+ など)
  • Go: 1.26 以上
  • Node.js: 20 以上
  • FFmpeg: 6.0 以上 (libx264 有効)
  • uv: Python パッケージマネージャ (NDI 入力利用時、およびクライアントシミュレータ利用時)
  • (Android クライアントをビルドする場合)
    • JDK 17 以上
    • Android SDK (platforms;android-34, build-tools;34.0.0)
    • SDK の場所を android-client/local.properties の sdk.dir=... または環境変数 ANDROID_HOME で指定

ビルド手順

ルートディレクトリの Makefile を使って、フロントエンド (Vue 3) とバックエンド (Go) を一括ビルドできます。フロントエンドのビルド成果物は Go バイナリ内に静的に埋め込まれます。

# フロントエンド・バックエンドの一括ビルド
make build

# テストの実行
make test

ビルドが完了すると、controller/bin/display-controller が生成されます。

開発時用の個別コマンド:

make build-frontend  # フロントエンドのみビルド
make build-backend   # Go コントローラのみビルド
make dev-frontend    # フロントエンド開発サーバ起動 (Vite)

起動方法

生成されたバイナリに設定ファイルを指定して実行します。

# 通常起動
./controller/bin/display-controller -config config.yaml

# または make コマンドで起動
make run

起動後、ブラウザで以下のURLを開きます。

  • Web-GUI ダッシュボード: http://localhost:8080

Androidクライアントアプリ (android-client/)

LG Display LD290EJS-FPN1 (Android 7.1 / 1920x540) 上で動作する映像受信・表示アプリです。

特徴

  • MediaCodec によるハードウェア H.264 デコード (SurfaceView 直接描画)
  • 1GB RAM 向け省メモリ設計 (中間 Bitmap 不使用により OOM を抑制)
  • イマーシブ全画面表示および端末起動時自動起動 (BOOT_COMPLETED)

ビルド手順

事前に「必要要件」の Android SDK を用意してください。

cd android-client

# デバッグ版 (署名済み。端末へそのままインストール可能)
./gradlew assembleDebug

生成物: android-client/app/build/outputs/apk/debug/app-debug.apk

# 端末へのインストール
adb install -r app/build/outputs/apk/debug/app-debug.apk

リリース版 (./gradlew assembleRelease) は署名設定がないため、app-release-unsigned.apk が生成され、署名しないと端末にインストールできません。

Python 環境 (NDI ブリッジ / シミュレータ)

NDI 入力 (cyndilib) とクライアントシミュレータ (av) の依存は、リポジトリ直下の pyproject.toml で管理され、.venv に作成されます。

make setup-python   # uv sync

コントローラはリポジトリ直下から起動してください (uv run --project . で .venv を参照します)。

クライアントシミュレータ (tools/simulator/)

実機がなくても、UDP で受信した H.264 ストリームをデコードして Web ブラウザ上で確認できます。Python 環境はリポジトリ直下の pyproject.toml から uv で .venv として自動作成されます (make setup-python)。

# display-1 (UDP :8554) のシミュレータを起動。ブラウザで http://localhost:9001 を開く
make run-simulator

設定 (config.yaml)

サーバポート、全体仮想キャンバス解像度、各ディスプレイの宛先IP/ポートおよびクロップ座標を設定します。

以下の例の ip: "127.0.0.1" はローカル検証 (シミュレータ) 用です。実機で運用する場合は、各ディスプレイ (Android クライアント) の実際の IP アドレスに変更してください。

server:
  http_port: 8080
  default_stream_port: 8554
  ws_ping_interval_sec: 5

canvas:
  width: 5760
  height: 540
  fps: 30

displays:
  - id: "display-1"
    name: "Display Left"
    ip: "127.0.0.1"
    port: 8554
    width: 1920
    height: 540
    crop_x: 0
    crop_y: 0
    bezel_padding_right: 0

  - id: "display-2"
    name: "Display Center"
    ip: "127.0.0.1"
    port: 8555
    width: 1920
    height: 540
    crop_x: 1920
    crop_y: 0
    bezel_padding_right: 0

  - id: "display-3"
    name: "Display Right"
    ip: "127.0.0.1"
    port: 8556
    width: 1920
    height: 540
    crop_x: 3840
    crop_y: 0
    bezel_padding_right: 0

media:
  default_mode: "testpattern" # "testpattern", "video", または "ndi"
  video_file: ""

ライセンス

MIT License

About

Diverse expressions in the DJ booth using joint displays

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages