画面共有
このモジュールは、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