Screen sharing
這個模組展示了如何使用Photon影片SDK來共享使用者畫面,透過u視窗捕捉第三方模組來捕捉。
概念
Photon影片SDK
Photon影片SDK是一個Photon語音SDK的特別版本,其包含支援影片串流。
在它專用的讀我檔案中有更多細節,其在SDK下載頁面中的Photon影片SDK。
可以透過記錄器執行IVideoRecorderPusher
來完成影片串流的捕捉,並且玩家可以執行IVideoPlayer
來處理重新播放。
u視窗捕捉
在這個模組中,u視窗捕捉來捕捉畫面內容。
u視窗捕捉提供特定視窗捕捉,或全桌面捕捉。在這個範例中,為了簡化,只支援全桌面捕捉。
uWindowCaptureRecorder
類別執行IVideoRecorderPusher
介面,其允許針對Photon影片SDK來收集幀。
為了啟用它,U_WINDOW_CAPTURE_RECORDER_ENABLE
必須被新增到定義符號。
模組邏輯
畫面共享發出
設定
為了能夠發出,場景必須含有:
- 一個
ScreenSharingEmitter
元件:它開始及停止捕捉及畫面共享排放。 - 一個
UwcManager
元件:它允許畫面由u視窗捕捉來捕捉。 - 一個
uWindowCaptureRecorder
元件:它收集u視窗捕捉材質,並且傳送它到Photon影片SDK - 在畫面共享發出器元件上的一些元件調用
ConnectScreenSharing()
及DisconnectScreenSharing()
- 在
NetworkRunner
遊戲物件上的一個FusionVoiceClient
元件,其開始語音階段(請參見語音 - Fusion整合)
開始發出
為了能夠發送影片,必須初始化一個Photon語音連線。模組假設這個已經透過傳統方式完成了,並且查看Update()
以了解階段何時開始。
在調用ConnectScreenSharing()
時,ScreenSharingEmitter
將首先等待語音階段初始化的完成。
然後,它也將等待u視窗捕捉初始化的完成。這是透過uWindowCaptureRecorder
OnReady
回調來完成。
當一切準備好後,調用FusionVoiceClient
上的VoiceClient.CreateLocalVoiceVideo
來建立一個傳輸通道(一個「語音」):從現在開始,記錄器將串流桌面捕捉。
如果提供了一個IEmitterListener
,它將透過OnStartEmitting
回調來進行發出開始的警告。
注意事項:在多重畫面的情況,可以透過畫面ID(從0開始)調用SelectDesktop
來選擇共享的桌面。
停止發出
調用DisconnectScreenSharing()
將中斷連線影片串流聲音。
如果提供了一個IEmitterListener
,它將透過OnStopEmitting
回調來進行發出結束的警告。
畫面共享接收
設定
為了能夠接收畫面共享,畫面必須含有:
- 一個
ScreenSharingReceiver
元件:它偵測新的影片連線,然後建立影片播放器及關聯的材質。 - 一個
ScreenSharingScreen
元件:它說明接收轉譯器,並且確保傳送Oculus Quest著色器所需的正確的資料。
選擇性地,可以設定一個LOD畫面處理器,來啟用MIP映射(針對低像素密度畫面來說很有用,比如在VR頭戴式裝置上)。
畫面共享接收器
接收器使用VoiceClient.OnRemoteVoiceInfoAction
回調來監視新的語音連線,其程式碼是影片轉碼器。
在該等連線時,它以Platform.CreateVideoPlayerUnityTexture
建立一個影片播放器。
然後,當這個影片播放器已經準備好(OnVideoPlayerReady
),它建立一個材質,其含有影片播放器材質,並且以EnablePlayback
傳送它到ScreenSharingScreen
:畫面將隨後更改其轉譯器材質為這個新的材質。
Oculus Quest著色器
針對Oculus Quest,一個特定的設定需要一個自訂著色器:
- 如果使用了URP管道
- 在Android上(這是針對Oculus Quest的案例)
- 如果使用單一通道(或多重檢視)轉譯(這在VR中很常見)
針對這個設置,預設Photon影片著色器不會工作。
這個模組提供一個特定的Quest影片材質Ext3D著色器以處理這個,而且ScreenReceiver
在需要時使用它。
為了順利工作,這個著色器需要在各個更新期間接收一些額外的關於轉譯器的資訊:在ScreenSharingScreen
Update()
中處理它。
MIP映射
影片SDK即時建立的材質無法提供MIP映射。在一些低密度像素的平台上,比如VR頭戴式裝置,它可能導致顫抖的效果。
為了處理這個問題,ScreenSharingScreenLODHandler
驅動一個相機,其以一個慢的速率來捕捉影片材質的圖片,以在另一個支援MIP映射的轉譯器上投射它。
安裝注意事項
在一個專案中安裝u視窗捕捉時,它的asmdef必須被新增到Photon/PhotonVoice/PhotonVoiceApi/PhotonVoice.API.asmdef,這樣uWindowCaptureRecorder
可以存取它。
相依性
目前的版本已經透過以下的軟體來測試:
- Fusion SDK 2.0
- Photon影片SDK 2.53
- u視窗捕捉1.1.0
示範
可在Assets\Photon\FusionAddons\ScreenSharing\Demo\Scenes\
資料夾中找到一個示範場景:
必須使用兩個客戶端來測試場景:
- 第一個客戶端是畫面共享發出器:
Emitter
遊戲物件必須被啟用,而Receiver
遊戲物件必須被停用, - 第二個客戶端是畫面共享接收器:
Emitter
遊戲物件必須被停用,而Receiver
遊戲物件必須被啟用,
因為StartSharingOnVoiceConnectionAvailable
預設被設定為真,在啟動場景時,發出器開始共享桌面。
下載
這個附加元件的最新版本被包含在附加元件專案之中
已支援拓撲
- 共享模式
更改記錄
- 版本2.0.2:在示範場景中更改轉碼器設定(VP8而非VP9)
- 版本2.0.1:在登錄語音客戶端之前新增驗證
- 版本2.0.0:支援Fusion 2.0
- 版本1.0.3:更新Photon語音影片SDK 2.53
- 版本1.0.2:在資源目錄中的移動Quest影片材質Ext3D著色器
- 版本1.0.1:畫面共享被重新命名為畫面共享及清理+新增命名空間
- 版本1.0.0:第一個版本