---
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](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カードに書き込んでから初回の起動は少し時間がかかる。）

BA：Connected上で転送タイプを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信号を送るのが良い。
	- というか、`jit.movie`は再生速度が全く均一にならないんであんまり使わないほうがいい。BrightSignの映像側にタイムコード音声を書き込んでおいてMaxでそれを受けて特殊配置のスピーカーで音再生、とかが一番ありえるユースケースかも。
		- [[MaxとSMPTE ToolでLTCをデコードした上で展示を自動起動させたい]]
- 内部がどういう仕組みかわからないが、UDPのメッセージのキューは割と簡単に詰まる。シークバーをぐりぐり動かすみたいな使い方はできない。
- 一時停止ができると便利なんだと思うが、いまいちやり方がわからなかった
- **追記：動画のファイルのビットレートによってコマンドを送ってからシーク完了までの時間が変わるっぽい。2GBの動画とかだとコマンド送ってから5秒ぐらいかかったりすることもある。** やっぱり本番用の同期システムの選択肢というよりは、ざっくりでもいいから確認できるシステム構築のためと割り切るほうが良さそう
