画面共有
このモジュールは、uWindowCaptureというサードパーティモジュールを通じてキャプチャされたユーザーの画面を共有するために、Photon Video SDKを使用する方法を示しています。
コンセプト
Photon VideoSDK
Photon Video SDKは、ビデオストリーミングのサポートを含むPhoton Voice SDKの特別なバージョンです。
詳細は、SDKダウンロードページの専用READMEに記載されています:Photon Video SDK。
ビデオストリームのキャプチャはIVideoRecorderPusherを実装したレコーダーによって行うことができ、再生はIVideoPlayerを実装したプレイヤーによって管理されます。
uWindowCapture
このモジュールでは、画面の内容をuWindowCaptureでキャプチャしています。
uWindowCaptureは、特定のウィンドウのキャプチャやフルデスクトップキャプチャを提供します。このサンプルでは、簡略化のためにフルデスクトップキャプチャのみがサポートされています。
uWindowCaptureRecorderクラスはIVideoRecorderPusherインターフェースを実装しており、Photon Video SDK用のフレームを収集することができます。
これを有効化するため、U_WINDOW_CAPTURE_RECORDER_ENABLEを定義シンボルに追加する必要があります。
モジュールロジック
画面共有の送信
セットアップ
送信を行うためには、シーンに以下が含まれている必要があります。
ScreenSharingEmitterコンポーネント:キャプチャと画面共有の送信を開始および停止します。UwcManagerコンポーネント:uWindowCaptureによって画面をキャプチャできるようにします。uWindowCaptureRecorderコンポーネント:uWindowCaptureテクスチャを収集し、それをPhoton Video SDKに渡します。ScreenSharingEmitterコンポーネントのConnectScreenSharing()およびDisconnectScreenSharing()を呼び出すコンポーネント。NetworkRunnerゲームオブジェクト上のFusionVoiceClientコンポーネント:ボイスセッションを開始します(Voice - Fusion Integrationを参照)。
送信開始
ビデオを送信するためには、Photon Voiceの接続が初期化されている必要があります。このモジュールは、これが従来の方法で既に行われていると仮定し、セッションの開始時に把握するためにUpdate()内を確認します。
ConnectScreenSharing()が呼び出されると、ScreenSharingEmitterはまずボイスセッションの初期化が完了するのを待ちます。
次に、uWindowCaptureの初期化が完了するのを待ちます。これは、uWindowCaptureRecorderのOnReadyコールバックを通じて行われます。
すべての準備が整うと、FusionVoiceClientのVoiceClient.CreateLocalVoiceVideoを呼び出すことで、伝送チャネル(「ボイス」)が作成されます。これ以降、レコーダーはデスクトップキャプチャをストリーミングします。
IEmitterListenerが提供されている場合、OnStartEmittingコールバックを通じて、送信の開始が通知されます。
備考:マルチスクリーンの状況では、0から始まるスクリーンIDを指定してSelectDesktopを呼び出すことで、共有するデスクトップを選択することできます。
送信停止
DisconnectScreenSharing()を呼び出すことで、ビデオストリーミングのボイスが切断されます。
IEmitterListenerが提供されている場合、送信の終了がOnStopEmittingコールバックを通じて通知されます。
画面共有の受信
セットアップ
画面共有を受信できるようにするためには、シーンに以下が含まれている必要があります:
ScreenSharingReceiverコンポーネント:新しいビデオ接続を検出し、その後ビデオプレイヤーと関連するテクスチャを作成します。ScreenSharingScreenコンポーネント:受信レンダラーを記述し、Oculus Questシェーダーによって必要な適切なデータを渡すことを保証します。
オプションとして、LODスクリーンハンドラーを設定することで、ミップマッピングを有効にすることができます(VRヘッドセットのような低画素密度のスクリーンに対して便利です)。
ScreensharingReceiver
受信者は、新しいボイス接続を監視し、VoiceClient.OnRemoteVoiceInfoActionコールバックを使用して、そこにはビデオコーデックのコードが含まれています。
このような接続が行われると、Platform.CreateVideoPlayerUnityTextureを使用してビデオプレイヤーを作成します。
次に、このビデオプレイヤーが準備完了になると(OnVideoPlayerReady)、ビデオプレイヤーのテクスチャを含むマテリアルを作成し、それをEnablePlaybackを使用してScreenSharingScreenに渡します。これにより、スクリーンはレンダラーのマテリアルを新しいものに変更します。
Oculus Questシェーダー
以下のような特定の設定では、Oculus Quest用にカスタムシェーダーが必要です。
- URPパイプラインが使用されている場合
- Android上で(これはOculus Questの場合です)
- シングルパス(またはマルチビュー)レンダリングが使用されている場合(これはVRでは一般的です)
この構成では、デフォルトのPhoton Videoシェーダーは動作しません。
このモジュールは、これに対応するために特定のQuestVideoTextureExt3Dシェーダーを提供しており、ScreenReceiverは必要に応じてこれを使用します。
このシェーダーが機能するためには、各更新ごとにレンダラーに関する追加情報を受け取る必要があります。これはScreenSharingScreenのUpdate()で処理されます。
このシェーダーを常に含めるシェーダーリストに追加することを忘れないでください(Unityプロジェクト設定/グラフィックス)。
ミップマッピング
ビデオSDKによってリアルタイムで作成されるテクスチャでは、ミップマッピングを提供できません。VRヘッドセットのようなピクセル密度が低いプラットフォームでは、震えるような効果を引き起こす可能性があります。
これに対処するために、ScreenSharingScreenLODHandlerがカメラを操作し、ビデオテクスチャの画像を遅いレートでキャプチャして、ミップマッピングをサポートする別のレンダラーに投影します。
インストールノート
プロジェクトにuWindowCaptureをインストールする際には、そのasmdefをPhoton/PhotonVoice/PhotonVoiceApi/PhotonVoice.API.asmdefに追加する必要があります。これにより、uWindowCaptureRecorderがアクセスできるようになります。
依存関係
現在のバージョンは以下の環境でテストされています。
- Fusion SDK 1.1.8
- Photon Video SDK 2.53
- uWindowCapture 1.1.0
デモ
デモシーンはAssets\Photon\FusionAddons\ScreenSharing\Demo\Scenes\フォルダにあります。
シーンをテストするには、2つのクライアントを使用する必要があります:
- 最初のクライアントは画面共有の送信者です:
Emitterゲームオブジェクトを有効にし、Receiverゲームオブジェクトを無効にしておく必要があります。 - 2番目のクライアントは画面共有の受信者です:
Emitterゲームオブジェクトを無効にし、Receiverゲームオブジェクトを有効にしておく必要があります。
StartSharingOnVoiceConnectionAvailableがデフォルトでtrueに設定されているため、シーンが起動するとエミッターがデスクトップの共有を開始します。
ダウンロード
このアドオン最新バージョンはaddon projectに含まれています。
サポートされているトポロジ
- shared mode
Changelog
- Version 1.0.4: Change codec settings in the demo scene (VP8 instead of VP9)
- Version 1.0.3: Update for PhotonVoice Video SDK 2.53
- Version 1.0.2: Move QuestVideoTextureExt3D shader in Resources directory
- Version 1.0.1: ScreenShare renamed to screensharing & cleanup + add namespace
- Version 1.0.0: First release