quartz-research-note/content/BrightSignをネットワーク経由でシークできるようにする.md

103 lines
9.5 KiB
Markdown
Raw Normal View History

---
date: 2024-08-02 16:50
---
#tips #installation #max
[[BrightSign]]単体での同期はBrightWallなどを使えば簡単だが、PCでの映像再生と混ぜる必要があるとき、PC側での映像再生とBrightSignをどうにか同期しなければならない。
頭出しだけなら設定ソフトのBrightAuthorから、UDPのインプットを受け取って動画ファイルごとの先頭に移動するよう設定できる。
だが、20分の映像を全て頭から終わりまで確認し続けなければならないのはつらい。プラグインを使用すると映像の再生位置を特定の場所までシークすることができるのだが、とにかく情報が少ないのでまとめておく。
なおここでは、設定ソフトにMacでも動作可能なBrightAuthor:Connectedを使用する。日本語版のDLページでは「BrightAuthor接続済み」となっているやつ
## プラグインスクリプトをDLする
今回使う「Rotate-and-Seek」プラグインは、一応公式が提供しているものっぽい。
使い方等は個々のフォーラムにあるものが全て。
[Rotate and Seek Plugin BrightSign Support](https://support.brightsign.biz/hc/en-us/community/posts/209962937-Rotate-and-Seek-Plugin)
フォーラムに貼ってあるのはv0.7らしいが、最新版はGitHubから手に入れるのが確実。
[BrightAuthor-Plugins/Rotate-and-Seek/rotate\_and\_seek.brs at master · brightsign/BrightAuthor-Plugins · GitHub](https://github.com/brightsign/BrightAuthor-Plugins/blob/master/Rotate-and-Seek/rotate_and_seek.brs)
なお、機能がちょいちょい追加されてるので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.movie`や`jit.qt.movie`ではない方)を使用する。このオブジェクトは非常に奇妙な仕様なので、動画の再生状態を全てアトリビュート経由で取得しなければならない。写真のパッチでは動画の長さと再生位置を`getattr`オブジェクトで取得している。
注意点としては以下の通り。
- シークするたびにそのフレームにジャンプしているが、シークして以後は特段同期しておらず各々フリーラン状態
- また当たり前だがUDPが送られてプラグインのseekが実行されるまでにはレイテンシがあるので、厳密にはMaxの再生位置をある程度オフセットする必要がある
- そもそも通常のBright ignでのUDPでのシンクはフレーム単位で同期してるわけではないのは公式でも書いてある。フレームレベルでの同期が必要ならBrightWall使うのが無難
- 自動ループする時、BrightSignのほうが若干ラグがあってからループする。そのため、実際には`jit.movie~`が自動ループしたタイミングでudp信号を送るのが良い。
- 内部がどういう仕組みかわからないが、UDPのメッセージのキューは割と簡単に詰まる。シークバーをぐりぐり動かすみたいな使い方はできない。