화면 공유
이 모듈에서는 Photon Video SDK를 사용하여 uWindowCapture 타사 모듈을 통해 캡처한 사용자 화면을 공유하는 방법을 설명합니다.
개념
Photon VideoSDK
Photon Video SDK는 비디오 스트리밍 지원을 포함한 Photon Voice SDK의 특별 버전입니다.
자세한 내용은 전용 README에서 확인할 수 있으며, SDK 다운로드 페이지 Photon Video SDK 에서 확인할 수 있습니다.
비디오 스트림의 캡처는 IVideoRecorderPusher
를 구현한 레코더로 할 수 있으며 재생은 IVideoPlayer
를 구현한 플레이어가 처리할 수 있습니다.
uWindowCapture
이 모듈에서 화면 내용은 uWindowCapture로 캡처됩니다.
uWindowCapture는 특정 윈도우 캡처 또는 전체 데스크톱 캡처를 제공합니다. 이 샘플에서는 단순화를 위해 전체 데스크톱 캡처만 지원합니다.
IVideoRecorderPusher
인터페이스를 구현한 uWindowCaptureRecorder
클래스를 통해 PhotonVideo SDK용 프레임을 수집할 수 있습니다.
활성화하려면 U_WINDOW_CAPTURE_RECORDER_ENABLE
을 정의 심볼에 추가해야 합니다.
모듈 로직
화면 공유 전송
설정
전송하려면 장면에 다음이 포함되어야 합니다:
ScreenSharingEmitter
컴포넌트: 캡처 및 화면 공유 전송을 시작 및 중지합니다.UwcManager
컴포넌트: uWindowCapture로 화면을 캡처할 수 있습니다.uWindowCaptureRecorder
컴포넌트: uWindowCapture 텍스처를 수집하여 PhotonVideo SDK에 전달합니다.- ScreenSharingEmitter 컴포넌트의
ConnectScreenSharing()
및DisconnectScreenSharing()
이라는 일부 컴포넌트 - 음성 세션을 시작하는
NetworkRunner
게임 객체의FusionVoiceClient
컴포넌트 (Voice - Fusion 통합 참조)
전송 시작
비디오를 전송하려면 Photon Voice 연결을 초기화해야 합니다. 모듈은 이 연결이 이미 클래식으로 진행되고 있다고 가정하고 Update()
를 통해 세션이 시작되는 시점을 알 수 있습니다.
ConnectScreenSharing()
을 호출하면 먼저 ScreenSharingEmitter
가 음성 세션 초기화가 완료될 때까지 기다립니다.
그런 다음 uWindowCapture 초기화가 완료될 때까지 기다립니다. 이는 uWindowCaptureRecorder
OnReady
콜백을 통해 수행됩니다.
모든 것이 준비되면 FusionVoiceClient
에서 VoiceClient.CreateLocalVoiceVideo
를 호출하여 전송 채널("음성")이 생성됩니다. 이제부터 녹음기는 데스크톱 캡처를 스트리밍 합니다.
IEmitterListener
가 제공되면 OnStartEmitting
콜백과 함께 전송 시작을 경고합니다.
*노트: 멀티스크린 상황에서는 화면 ID가 있는 SelectDesktop
을 0.*부터 호출하여 공유하는 데스크톱을 선택할 수 있습니다
전송 중지
DisconnectScreenSharing()
을 호출하면 비디오 스트리밍 음성의 연결이 끊어집니다.
IEmitterListener
가 제공되면 OnStopEmitting
콜백과 함께 전송 종료를 경고합니다.
화면 공유 응답
설정
화면 공유를 받으려면 씬에 다음이 포함되어야 합니다:
ScreenSharingReceiver
컴포넌트: 새로운 비디오 연결을 감지한 다음 비디오 플레이어와 관련 텍스처를 만듭니다.ScreenSharingScreen
컴포넌트: 수신 렌더러를 설명하고 Oculus Quest 셰이더에 필요한 적절한 데이터를 전달합니다.
선택적으로 LOD 화면 핸들러를 설정하여 밉 매핑을 활성화할 수 있습니다(VR 헤드셋과 같이 픽셀 해상도가 낮은 화면에 사용 가능).
ScreensharingReceiver
수신기는 VoiceClient.OnRemoteVoiceInfoAction
콜백으로 새로운 음성 연결을 시청합니다. 이 콜백의 코드는 비디오 코덱입니다.
연결되면 Platform.CreateVideoPlayerUnityTexture
로 비디오 플레이어를 만듭니다.
그런 다음 이 비디오 플레이어가 준비되면(OnVideoPlayerReady
) 비디오 플레이어 텍스처가 포함된 머티리얼을 생성한 다음 EnablePlayback
을 사용하여 ScreenSharingScreen
에 전달합니다. 그러면 화면은 렌더러 머티리얼을 새로운 것으로 바꿉니다.
Oculus Quest 셰이더
특정 설정을 사용하려면 Oculus Quest에 대한 사용자 지정 셰이더가 필요합니다:
- URP 파이프라인을 사용하는 경우
- Android에서 (오큘러스 퀘스트의 경우)
- 단일 패스(또는 다중 뷰) 렌더링이 사용되는 경우(VR에서 일반적인 경우)
이 구성의 경우 기본 Photon Video 셰이더가 작동하지 않습니다.
이 모듈은 이를 처리하기 위한 특정 QuestVideoTextureExt3D 셰이더를 제공하며, ScreenReceiver
는 필요할 때 이를 사용합니다.
작동하려면 이 셰이더가 각 업데이트 중에 렌더러에 대한 몇 가지 추가 정보를 받아야 합니다: ScreenSharingScreen
Update()
에서 처리됩니다.
Always Included Shaders
목록에 이 셰이더를 추가하십시오(유니티 프로젝트 설정/그래픽)
밉-매핑
비디오 SDK에 의해 즉석에서 만들어진 텍스처는 밉 매핑을 제공할 수 없습니다. VR 헤드셋과 같이 픽셀 밀도가 낮은 일부 플랫폼에서는 떨림 효과로 이어질 수 있습니다.
이를 처리하기 위해 ScreenSharingScreenLODHandler
는 동영상 텍스처의 사진을 느린 속도로 캡처하는 카메라를 구동하여 다른 렌더러에 투사하여 밉 매핑을 지원합니다.
설치 노트
프로젝트에 uWindowsCapture를 설치할 때는 프로젝트의 Photon/PhotonVoice/PhotonVoiceApi/PhotonVoice.API.asmdef에 추가해야 uWindowCaptureRecorder
가 접근할 수 있습니다.
의존성
현재 버전은 아래 기준으로 테스트하였습니다:
- Fusion SDK 2.0
- Photon Video SDK 2.53
- uWindowCapture 1.1.0
데모
데모 씬은 Assets\Photon\FusionAddons\ScreenSharing\Demo\Scenes\
폴더에 있습니다:
씬을 테스트하려면 두 개의 클라이언트를 사용해야 합니다:
- 첫 번째 클라이언트는 화면 공유
Emitter
게임 객체는 활성화되어 있어야 하고Receiver
게임 객체는 비활성화되어 있어야 합니다, - 두 번째 클라이언트는 화면 공유 수신기입니다.
Emitter
게임 객체는 비활성화해야 하고Receiver
게임 객체는 비활성화해야 합니다,
기본적으로 StartSharingOnVoiceConnectionAvailable
이 true로 설정되어 있기 때문에 화면이 시작되면 이미터는 바탕 화면을 공유하기 시작합니다.
다운로드
이 애드온의 최신 버전은 애드온 프로젝트에 포함되어 있습니다.
지원하는 토폴로지
- 공유 모드
변경 내역
- 버전 2.0.2: 데모 장면에서 코덱 설정 변경(VP9 대신 VP8)
- 버전 2.0.1: 음성 클라이언트 등록 전에 확인 추가
- 버전 2.0.0: Fusion 2.0 지원
- 버전 1.0.3: PhotonVoice Video SDK 2.53용 업데이트
- 버전 1.0.2: QuestVideoTextureExt3D 셰이더를 Resources 디렉터리로 이동
- 버전 1.0.1: ScreenShare 이름을 screensharing & cleanup로 변경하고 네임스페이스 추가
- 버전 1.0.0: 최초 릴리즈