This document is about: FUSION 2
SWITCH TO

Screen sharing


Available in the Industries Circle
Circle
Fusion Industries プロトタイピングアドオン

このモジュールでは、サードパーティー製のuWindowCaptureでキャプチャしたユーザーのスクリーンを、Photon Video SDKを使用して共有する方法を説明しています。

概要

Photon VideoSDK

このPhoton Video SDKは特別なバージョンで、ビデオストリーミングのサポートを含んでいます。

詳細は、SDKダウンロードページのPhoton Video SDKから入手できるSDKのREADMEをご覧ください。

ビデオストリームのキャプチャはIVideoRecorderPusherを実装するレコーダーで行われ、再生はIVideoPlayerを実装するプレイヤーで制御されます。

uWindowCapture

このモジュールでは、スクリーン内容はuWindowCaptureでキャプチャされます。

uWindowCaptureは、特定のウインドウキャプチャや全画面デスクトップキャプチャを提供します。このサンプルでは簡単のため、全画面デスクトップキャプチャのみをサポートしています。

uWindowCaptureRecorderクラスはIVideoRecorderPusherインターフェースを実装していて、Photon Video SDKでフレームを収集できます。

これを有効にするには、Define SymbolsにU_WINDOW_CAPTURE_RECORDER_ENABLEを追加する必要があります。

モジュールのロジック

Screen sharing image transfer logic
Screen sharingの画像転送ロジック

Screen sharingの配信

セットアップ

配信できるようにするには、シーンに以下を含める必要があります。

To be able to emit, the scene must contain:

  • ScreenSharingEmitterコンポーネント:キャプチャの開始/停止と、Screen sharingの配信
  • UwcManagerコンポーネント:uWindowCaptureでスクリーンをキャプチャできるようにします
  • uWindowCaptureRecorderコンポーネント:uWindowCaptureのテクスチャを収集し、Photon Video SDKに渡します
  • ScreenSharingEmitterコンポーネントのConnectScreenSharing()DisconnectScreenSharing()を呼び出すコンポーネント
  • NetworkRunnerゲームオブジェクトのFusionVoiceClientコンポーネント:Voiceのセッションを開始します(Voice - Fusionインテグレーションを参照)

以下に注意してください。

  • FullHD解像度(1920x1080)のスクリーン共有は、Quest2とQuest3の端末で正しく動作します
  • 高解像度(3440x1440など)はQuest2では動きますが、Quest3ではOSの更新でサポートされなくなっています

配信の開始

ビデオを送信できるようにするためには、Photon Voiceの接続が初期化されている必要があります。このモジュールは、接続が通常通りに行われていることを前提にして、セッションが開始されるタイミングをUpdate()で待ち受けます。

ConnectScreenSharing()を呼び出すと、最初にScreenSharingEmitterはVoiceセッションの初期化が完了するまで待機します。

それから、uWindowCaptureの初期化が完了するまで待機します。これはuWindowCaptureRecorderOnReadyコールバックで行われます。

すべての準備が完了すると、FusionVoiceClientVoiceClient.CreateLocalVoiceVideoを呼び出し、転送チャネル(voice)が作成されます。その後、レコーダーはデスクトップキャプチャをストリームします。

IEmitterListenerが与えられると、OnStartEmittingコールバックから配信開始を通知します。

備考:マルチスクリーン環境では、0から始まるスクリーンIDをSelectDesktopに渡して呼び出すことで、共有するデスクトップを選択することができます。

配信の停止

DisconnectScreenSharing()を呼び出すと、Voiceのビデオストリーミングを切断します。

IEmitterListenerが与えられると、OnStopEmittingコールバックから配信停止を通知します。

Screen sharingの受信

セットアップ

Screen sharingを受信できるようにするには、シーンに以下を含める必要があります。

  • ScreenSharingReceiverコンポーネント:新しいビデオ接続を検知して、ビデオプレイヤーと関連するテクスチャを作成します
  • ScreenSharingScreenコンポーネント:受信したものを写すために、Oculus Questのシェーダーに正しいデータを渡すことを保証します

オプションとして、LODスクリーンハンドラーをセットアップして、ミップマップを有効にすることができます(VRヘッドセットのような、低解像度スクリーンで便利です)。

ScreenSharingReceiver

ScreenSharingReceiverは、VoiceClient.OnRemoteVoiceInfoActionコールバックで新しいVoice接続を監視します。コードにはビデオコーデックが含まれます。

この接続に対して、Platform.CreateVideoPlayerUnityTextureからビデオプレイヤーを作成します。

それから、ビデオプレイヤーの準備が完了(OnVideoPlayerReady)したら、ビデオプレイヤーのテクスチャを持つマテリアルを作成し、EnablePlaybackでそれをScreenSharingScreenに渡します。スクリーンは、新しいマテリアルに変更されます。

Oculus Quest シェーダー

Oculus Questのカスタムシェーダーには特定の設定が必要です。

  • URPパイプラインが使用されている
  • Android上で動作している(Oculus Questに当てはまる)
  • シングルパス(またはマルチビュー)レンダリングが使用されている(VR共通)

この設定では、デフォルトのPhoton Videoシェーダーは動作しません。

このモジュールは、これを制御するための固有のQuestVideoTextureExt3Dシェーダーを提供していて、必要に応じてScreenReceiverで使用します。

シェーダーを動作させるには、更新ごとにレンダラーについての追加の情報を受け取る必要があります。これは、ScreenSharingScreenUpdate()で処理されます。

シェーダーがAlways Included Shadersリスト(UnityのProjectのSettings/Graphics)に追加されていることを確認してください。

ミップマップ

Video SDKで動的に作成されたテクスチャにはミップマップがありません。VRヘッドセットのような解像度が低いプラットフォームでは、表示の収縮を引き起こします。

これを解決するため、ScreenSharingScreenLODHandlerがカメラを操作して、ビデオテクスチャの画像を低レートでキャプチャし、他のレンダラーに投影することで、ミップマップをサポートします。

インストールについて

uWindowCaptureをプロジェクトにインストールする際は、uWindowCaptureRecorderがアクセスできるように、Photon/PhotonVoice/PhotonVoiceApi/PhotonVoice.API.asmdefを追加する必要があります。

依存関係

現在のバージョンは、以下でテストされています。

  • Fusion SDK 2.0
  • Photon Video SDK 2.53
  • uWindowCapture 1.1.0

デモ

デモシーンはAssets\Photon\FusionAddons\ScreenSharing\Demo\Scenes\フォルダーにあります。

シーンをテストするには、2つのクライアントを使用する必要があります。

  • 最初のクライアントはScreensharingの配信:Emitterゲームオブジェクトは有効、Receiverゲームオブジェクトは無効
  • 2つ目のクライアントはScreensharingの受信:Emitterゲームオブジェクトは無効、Receiverゲームオブジェクトは有効

StartSharingOnVoiceConnectionAvailableはデフォルトでtrueに設定されているため、シーンが読み込まれた時にデスクトップ共有の配信が開始されます。

Fusion Industries Addon ScreenSharing

ダウンロード

このアドオンの最新バージョンは、Industries アドオンのプロジェクトに含まれています。

対応するトポロジー

  • 共有モード

更新履歴

  • Version 2.0.3: Fix localVoiceVideo not set to null in DisconnectScreenSharing()
  • Version 2.0.2: Change codec settings in the demo scene (VP8 instead of VP9)
  • Version 2.0.1: Add verification before register voice client
  • Version 2.0.0: Fusion 2.0 support
  • 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
Back to top