Screen sharing
このモジュールでは、サードパーティー製の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の配信
セットアップ
配信できるようにするには、シーンに以下を含める必要があります。
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の初期化が完了するまで待機します。これはuWindowCaptureRecorder
のOnReady
コールバックで行われます。
すべての準備が完了すると、FusionVoiceClient
でVoiceClient.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
で使用します。
シェーダーを動作させるには、更新ごとにレンダラーについての追加の情報を受け取る必要があります。これは、ScreenSharingScreen
のUpdate()
で処理されます。
シェーダーが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
に設定されているため、シーンが読み込まれた時にデスクトップ共有の配信が開始されます。
ダウンロード
このアドオンの最新バージョンは、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