今回は、KlakNDIのセットアップを紹介します。
そもそもNDIとは何か?NDIは、LANで映像データを送ることができるサービスです。KlakNDIでは、Unityのカメラで映した映像を、NDI化して送信します。
NDI本家様:NDI SDK
KlakNDI本家様:https://github.com/keijiro/KlakNDI
以下を参考にさせていただきました。手順はかなり異なるので、もし本記事でうまくいかない場合はご確認ください。
参考:【Unity】KlakNDIを使ってみる
0. 動作環境
本記事では、以下の環境で試しました。
Unity:2019.4.29f1
KlakNDI:2.0.3
PC:MacOS Monterey
1. 必要なパッケージを準備
KlakNDIを使うためには、Scoped Registryを使用する必要があります。Scoped Registryとは、簡単に説明すると「元はUnityにないPackage」です。詳しくはスコープ付きレジストリをご確認ください。
1-1. PackageManagerにScoped Registryを追加
Scoped Registryの追加方法です。
Edit > Project Settings > Package Manager > Scoped Registriesを開きます。左下の+ボタンを押し、要素を追加します。以下、それぞれ入力が完了したら、右下の「Save(保存する)」を押します。
〜〜〜〜〜〜〜〜〜〜
Name:Keijiro
URL:https://registry.npmjs.com
Scope(s):jp.keijiro
〜〜〜〜〜〜〜〜〜〜
Name:Unity NuGet
URL:https://unitynuget-registry.azurewebsites.net
Scope(s):org.nuget
〜〜〜〜〜〜〜〜〜〜
1-2. Assembly Version Validationのチェックを外す
パッケージをインポートする前に、同じプロジェクト設定から設定を済ませます。
そして、「Project Settings > Player > Other Settings > Assembly Version Validate」のチェックを外します。ここを切っておかないと、なぜかエラーが出ます。エラーというか、コンポーネントを追加できません。追加しようとした時、エラーが出ます。dllの参照に問題があるみたいですが、正直よく分かりません。情報求む。
(2022/05/14追記)
どうやら、レジストリのUnityNuGetのバージョンが4.5.0を使用しているのに対し、KlakNDIのバージョンが4.5.3でズレている所が怪しいかも?マネージドdllのバージョンを合わせた方がいいとのことです。(にー兄さん、ありがとうございます)
1-3. PackageManagerからインポート
「Window > Packgage Manager」でPackageMangerを開きます。
左上から、「My Registry」を選択します。
そして、以下を探し、右下の「Install」ボタンでインストールします。
・KlakNDI
・System.Memory(NuGet)
2. 送信側の設定
2-1. RenderTextureを作成
Projectビューの「+ボタン」を押す > 「RenderTexture」を押す
名前はなんでもいいです。私は「SenderTexture」としました。
また、解像度も指定しましょう。私は「1600x900」にしました。
2-2. NDI送信用カメラの作成
2-2-1. カメラを追加
送信用プロジェクトには、2つカメラが必要になります。
・送信用プロジェクト側の表示をするカメラ(Main Camera)
・受信用プロジェクト側にデータを送るカメラ(NDISenderCamera)
既存のMain Cameraに加えて、「NDISenderCamera」(名前は自由)というカメラを作りましょう。
2-2-2. 位置を合わせる
NDISenderCameraは、Main Cameraと同じPosition・Rotationにしましょう。見えているもの(Main Camera)と実際に送るもの(NDISenderCamera)が違うと具合が悪いと思うので。
2-2-3. RenderTextureをアタッチ
ヒエラルキーの+ボタンから、「Camera」を押します。名前は、「NDISenderCamera」とします。名前に決まりはありません。
NDISenderCameraのインスペクタから、「Camera > Target Texture」に2-1で作成したRenderTextureをドラッグ&ドロップで追加します。
2-2-4. コンポーネント追加
次に、NDISenderCameraのインスペクタに「NdiSender」というコンポーネント(スクリプト)を追加します。AddComponentというボタンを押し、検索をかけるとすぐ見つかります。
2-2-5. NdiSenderの設定
(1) NdiSenderの「CaptureMethod」を「Texture」にします。
(2)NdiSenderの「NDI Name」に、送信するNDIの名前を入力します。名前は自由です。今回は、「NDISender」としました。
(3)表示された「Source Texture」に2-1で作成したテクスチャをドラッグ&ドロップで設定します。
ちなみになぜ2つのカメラで役割を分けるかというと、NDISenderCameraにはRenderTextureをアタッチしているからです。アタッチすると、カメラが映らなくなります。送信側・受信側で同じものが映ってもいいなら、MainCameraの子にNDISenderCameraを指定し、MainCameraをカメラワークするといいでしょう。
2-3. 適当にオブジェクト配置
映したいものが既にある場合、この工程は不要です。
何もなかったら、キューブの一つでもカメラの前に配置しておきましょう。
2-4. ビルドする
(1)「File > Bulid Settings」を押し、ビルド設定ウィンドウを表示します。
(2)「シーンを追加」ボタンで、現在のシーンを追加します。
(3)右下の「Build」を押します。
保存先や名前を聞かれますが、適当で問題ないです。ただし、ビルドするとフォルダやファイルが6つほど生成されて保存先が汚くなります。なので、先に「NDISender」的な名前のフォルダを作成して、その中にビルドすることをおすすめします。
3. 受信側の作成
受け取り用のシーンを作成します。
もしくは、受け取り側の別プロジェクトを作ります。その場合、送信側と同じようにKlakNDIを導入しましょう。手順1番(1-1〜1-3)だけでいいです。送信側の作成は不要です。
3-1. RenderTextutreを作成し、マテリアルにする
2-1と同じ手順でRenderTextureを作成します。
その後、Projectビューの+マークを押し、マテリアルを作成します。Shaderは「Standerd」になっていると思いますが、これを「Unlit > Texture」にします。そして、RenderTextureをアタッチします。
3-2. スクリーンを作成
(0)まず、ビルドした送信側のファイルを実行しておきましょう。
(1)ヒエラルキーの+ボタンを押し、「3D Object > Quad」を押してQuadを作成します。
NDIで受け取った映像を映すスクリーンなので、PlaneやCubeでも問題はありません。(VR系ではQuadをスクリーンにするのが一般的な気がするので、特別理由がなければQuadがいいでしょう)
Quadの縦横比は、RenderTextureと同じ縦横比にしましょう。
(2)Quadに3-1で用意したマテリアルをアタッチします。
(3)Quadに「AddComponent」でNDIReceiverを追加します。
(4)NdiReceiverには「NDI Name」という項目があります。手入力もできますが、スペース・大文字小文字など多分間違えてうまく行きません。右にあるボタン「Select」を押し、2-2で指定した送信側のNDI Nameを探します。名前は、[PC名(NDI名)]という感じになっています。
(5)「Target Texture」には、3-1で作成したRenderTextureを指定します。
3-3. 実行
実行してみます。すると、Quadに映像が映し出されるはずです。
以下は静止画ですが、送信側でキューブが動くと、受信側でもキューブが動いて見えます。
4. トラブルシューティング
・Canvasが映らない!
→ワールド空間しか映らないようです。
・映像が歪む!
RenderTextureとQuadのアスペクト比が一致していない可能性があります。
・NDISender、NDIReceiverが追加できない
→「Project Settings > Player > Other Settings > Assembly Version Validate」のチェックを外す。それでも出てこなければ、Unityを再起動する。
・送信側の画面が真っ暗。でも受信側で映る
→RenderTextureをアタッチしたカメラは、映像を映しません。
・送信側も、受信側もオブジェクトが映らない
→Unityで初歩的なミスをしている可能性あり。カメラのインスペクタから「near」「far」の指定が正しいですか?nearより近い・farより遠いと映りません。
5. まとめ
いかがでしたでしょうか。今回は、KlakNDIの使い方を紹介しました。
エンジニア側はサーバを用意せず、LANで繋がれたネットワーク内で映像を共有できます。