quartz-research-note/content/BrightSignをネットワーク経由でシークできるようにする.md
松浦 知也 Matsuura Tomoya ce0c6b1ddf
All checks were successful
Build / build (push) Successful in 2m52s
[obsidian] vault backup: 2024-08-12 16:28:50
2024-08-12 16:28:50 +09:00

10 KiB
Raw Permalink Blame History

date
2024-08-02 16:50

#tips #installation #max

BrightSign単体での同期はBrightWallなどを使えば簡単だが、PCでの映像再生と混ぜる必要があるとき、PC側での映像再生とBrightSignをどうにか同期しなければならない。

頭出しだけなら設定ソフトのBrightAuthorから、UDPのインプットを受け取って動画ファイルごとの先頭に移動するよう設定できる。

だが、例えば20分とかある映像を全て頭から終わりまで確認し続けなければならないのはつらい。プラグインを使用すると映像の再生位置を特定の場所までシークすることができるのだが、とにかく情報が少ないのでまとめておく。

なおここでは、設定ソフトにMacでも動作可能なBrightAuthor:Connectedを使用する。日本語版のDLページでは「BrightAuthor接続済み」となっているやつ。一応普通のBrightAuthorでも実行可能。

プラグインスクリプトをDLする

今回使う「Rotate-and-Seek」プラグインは、一応公式が提供しているものっぽい。 使い方等は個々のフォーラムにあるものが全て。

Rotate and Seek Plugin BrightSign Support

フォーラムに貼ってあるのはv0.7らしいが、最新版はGitHubから手に入れるのが確実。

BrightAuthor-Plugins/Rotate-and-Seek/rotate_and_seek.brs at master · brightsign/BrightAuthor-Plugins · GitHub

なお、機能がちょいちょい追加されてるのでSeek以外に再生スピードの変更などもできる。

PC側のLANセットアップ

ここではPCのIPアドレスを192.168.1.1、サブネットを255.255.255.0にする。 !img/スクリーンショット 2024-08-02 19.46.58.png

BrightSignのLANのセットアップ

まず、BrightSignに個別のIPアドレスを割り振る。ここではBrightSignがローカルネットワークPC間で直挿しか、スイッチングハブを介して複数台つながっているものとする。

プレイヤーに読み込ませるSDカードを用意する。

BA:Connectedを立ち上げ”Player Setup”を選択。IPアドレスを192.168.1.2に設定BSを2台以上使うなら1.3,1.4,,,と増やしていく。デフォルトゲートウェイとDNSは、ルーターが接続されてるならそのアドレスを、なければ適当にホストのPCと同じにしておく。

!img/スクリーンショット 2024-08-02 19.07.22.png またここで、Publishing ModeをLocal Networkにしておくと、動画ファイルの更新をSDカードの差し替えではなくLAN経由でSDカードに書き込める。4k動画とかだとギガビットイーサネットでは速度が遅くなるかもしれないが、動画のファイルの差し替えをしない限り設定の更新のアップロードは一瞬で終わるので便利

Presentationの作成

Dashboardに戻り、Presentationを作成する。適当にSingle Zone-Playlistのテンプレートを選択してStart。 !img/スクリーンショット 2024-08-02 19.50.57.png Presentationができたら、まず右側のPresentation Settingsで、Variableを作成する。Add Variableをクリックする。 !img/スクリーンショット 2024-08-02 19.53.22.png 今回は、動画の再生位置を保存するpositionという名前で作成。AccessはPrivate、TypeはLocalのままで良い。 !img/スクリーンショット 2024-08-02 19.54.43.png

プラグインの読み込み

Presentation SettingのSupport Contentから、Script Pluginのボタンをクリックしてプラグインを追加する。Script Plugin Sourceにはダウンロードしてきたbrsファイルのプラグインを指定する。ここで重要なのは、Script Plugin Nameに指定する名前はプラグインによって異なり、自由に決められるわけではないということ。今回のプラグインの場合は必ず"custom"という名前でなくてはならない。

!img/スクリーンショット 2024-08-02 19.56.30.png

UDPの設定

Presentation SettingのInteractiveという項のNetworkingで、UDPという項目をチェック。今回は受信のみなのでここの設定はほぼデフォルトのままで問題ないが、UDPの受信ポートを変えたい場合はUDP Receiver Portを変更する。 !img/スクリーンショット 2024-08-02 19.58.46.png

動画の設定

真ん中のLayout/ContentタブでContentをクリックして動画の追加をする。 左サイドバーで、LibraryのLocal Folder右のOpenボタンで、PC内の動画の入っているフォルダを選択。 中央下のAssetsタブで入っている動画が一覧表示されるので、再生したい動画をドラッグ&ドロップする。 その後、中央右上のInteractiveスイッチを有効化する。

!img/スクリーンショット 2024-08-02 20.01.10.png 有効化するとこんな見た目になる。 上のEvents一覧を真ん中あたりまでスクロールすると、UDPという項目があるので、これを一度クリックして選択状態にする。 !img/スクリーンショット 2024-08-02 20.04.18.png この状態で動画下側のファイル名が表示されてるあたりをクリックすると、UDPイベントが紐づけられる。これだといかにも動画再生をトリガーにUDPを送信するみたいな見た目をしているが、実際にはUDPの受信イベントもここで制御する。右側のEvent Propertiesで、Specify UDP inputに対してposition:<any>と記述する。Labelも同時に記入されるが、ここは気にしなくていいまた、ここでAssign input to variableにチェックを入れる。こうすることで、例えば”position:1000”というUDPメッセージが送られてくると、先ほど作ったpositionというUser Variableが1000に更新されるようになる。

!img/スクリーンショット 2024-08-02 20.07.15.png

UDPイベントからプラグインを発火させる

最後に、Event Propertiesの一番下のAdvancedを開く。Commandsで+をクリックしてイベントと同時に起動するコマンドを作る。Commandは"Send"、”Command Parameters”はSend plugin messages、送り先はcustom(これしか選べないはず)にする。 最後のPlugin messageの内容だが、seek!{{position}}とする。{{variable}}でPresentation内のUser Variableを埋め込むことができるが、これはBA:Connectedの仕様で、普通のBrightAuthorの場合は$$variable$$で埋め込む必要がある。

今回は一つしか動画を使ってないが、seek!(zoneの名前)!{{position}}のようにすれば、2つの再生動画の位置をそれぞれ変更するようなこともできる。

!img/スクリーンショット 2024-08-02 20.10.37.png これで、真ん中右上のセーブアイコンをクリックしてプロジェクトを保存したら、その右のPublishボタンをクリックしてBrightSignに転送する。

BrightSignにSDカードを入れて、LANケーブルをPCと接続して起動する。SDカードに書き込んでから初回の起動は少し時間がかかる。

BAConnected上で転送タイプをLocal Networkにし、Networked Playersのをクリックして、転送先に先ほど指定したIPアドレス192.168.1.2を指定すると、Publishできるようになる。Publishできたら即座にBrightSignは再起動して、普通に動画のループ再生が始まる。

MaxからLAN越しにシークしてみる

Maxでは、udpsendオブジェクトで指定したIPの5000番ポート標準に、position:2000みたいなメッセージを送れば良い。数値はミリ秒単位で整数。jit.movieで同じ動画ファイルを読み込ませて、シークバーっぽいインターフェースで同じフレームへジャンプできるパッチをこんな感じで作った。

!img/スクリーンショット 2024-08-02 20.25.24.png

jit.movie~jit.moviejit.qt.movieではない方)を使用する。このオブジェクトは非常に奇妙な仕様をしており、動画の再生状態を全てアトリビュート経由で取得しなければならない。写真のパッチでは動画の長さと再生位置をgetattrオブジェクトで取得している。

注意点としては以下の通り。

  • シークするたびにそのフレームにジャンプしているが、シークして以後は特段同期しておらず各々フリーラン状態
    • また当たり前だがUDPが送られてプラグインのseekが実行されるまでにはレイテンシがあるので、厳密にはMaxの再生位置をある程度オフセットする必要がある
    • そもそも通常のBright ignでのUDPでのシンクはフレーム単位で同期してるわけではないのは公式でも書いてある。フレームレベルでの同期が必要ならBrightWall使うのが無難
  • 自動ループする時、BrightSignのほうが若干ラグがあってからループする。そのため、実際にはjit.movie~が自動ループしたタイミングでudp信号を送るのが良い。
  • 内部がどういう仕組みかわからないが、UDPのメッセージのキューは割と簡単に詰まる。シークバーをぐりぐり動かすみたいな使い方はできない。
  • 一時停止ができると便利なんだと思うが、いまいちやり方がわからなかった
  • 追記動画のファイルのビットレートによってコマンドを送ってからシーク完了までの時間が変わるっぽい。2GBの動画とかだとコマンド送ってから5秒ぐらいかかったりすることもある。 やっぱり本番用の同期システムの選択肢というよりは、ざっくりでもいいから確認できるシステム構築のためと割り切るほうが良さそう