프레젠테이션 - 화면 공유
프레젠테이션이란 사용자(발표자)가 다른 참여자에게 슬라이드 같은 자료를 보여주기 위해 자신의 화면을 공유하는 것을 말합니다. 여기서는 통화 유형별로 프레젠테이션 기능을 사용하는 방법을 설명합니다.
| 기능 | 지원 통화 유형 | 최소 SDK 버전 |
|---|---|---|
| 송신(화면 캡처 및 전송) | 1대1 통화, 그룹 통화(컨퍼런스) | Android: 1.2 iOS: 1대1 통화 0.8, 그룹 통화 0.9 |
| 수신(상대 화면 공유 렌더링) | 1대1 통화, 그룹 통화(컨퍼런스) | 1대1 통화: 0.8 그룹 통화: 0.9 |
- 1.2 버전부터 화면 공유 캡처 및 전송은 Android와 iOS 모두에서 지원되지만, 플랫폼별 동작 방식이 다릅니다.
- Android에서는 PlanetKit이 직접 화면을 캡처합니다. 애플리케이션이
startMyScreenShare()를 호출하면, PlanetKit이 시스템 화면 캡처 동의를 요청하고 미디어 프로젝션 포그라운드 서비스에서 캡처를 실행합니다. - iOS에서는 애플리케이션이 Broadcast Upload Extension을 통해 화면을 캡처하고, 통화 시작 시 설정한
ScreenShareKey를 사용해NWConnection으로 PlanetKit에 스트림을 전송합니다.
- Android에서는 PlanetKit이 직접 화면을 캡처합니다. 애플리케이션이
- 상대방의 화면 공유 수신은 양 플랫폼 모두 지원되며, 흐름은 동일합니다.
- PlanetKit은 프레젠테이션 기능에 HD 해상도를 사용하므로, 클라이언트의 네트워크 상태가 권장 대역폭 이상일 때 최적화된 서비스를 이용할 수 있습니다.
Android
필수 조건
화면 캡처는 PlanetKit이 시작하는 포그라운드 서비스에서 실행되지만, 해당 서비스와 권한은 애플리케이션에서 선언해야 합니다. 앱의 AndroidManifest.xml에 다음을 추가하세요.
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
<application ...>
<service
android:name="com.example.planet_kit_flutter.screenshare.PlanetKitScreenShareService"
android:foregroundServiceType="mediaProjection"
android:exported="false" />
</application>
PlanetKit이 알림 채널을 생성하고 "Screen sharing" 진행 중 알림을 직접 게시하므로, 별도의 알림 설정은 필요하지 않습니다.
포트 번호나 토큰을 정의할 필요가 없고, setScreenShareKey()를 호출할 필요도 없습니다. 이는 iOS 브로드캐스트 확장 흐름에서만 사용됩니다.
1대1 통화
프레젠테이션 시작
Android 1대1 통화에서 프레젠테이션을 시작하는 흐름은 다음과 같습니다.
프레젠테이션 중지
Android 1대1 통화에서 프레젠테이션을 중지하는 흐름은 다음과 같습니다.
그룹 통화
프레젠테이션 시작
Android 그룹 통화에서 프레젠테이션을 시작하는 흐름은 다음과 같습니다.
프레젠테이션 중지
Android 그룹 통화에서 프레젠테이션을 중지하는 흐름은 다음과 같습니다.
화면 공유가 자동으로 중지되는 경우
사용자가 직접 중지하는 경우 외에도, 화면 캡처 모듈에서 오류가 보고되면 Android용 PlanetKit이 화면 공유를 중지합니다. 피어는 1대1 통화에서 onPeerScreenShareStopped로, 그룹 통화에서는 state=disabled가 포함된 onScreenShareUpdate로 알림을 받으며, 화면 공유 송신자는 state=disabled가 포함된 PlanetKitMyMediaStatusHandler.onScreenShareStateUpdate로 알림을 받습니다.
애플리케이션이 요청하지 않아도 화면 공유가 중지될 수 있으므로, UI는 startMyScreenShare()의 반환값만이 아니라 onScreenShareStateUpdate를 기준으로 업데이트하세요.
iOS
필수 조건
- 애플리케이션은 화면 캡처를 위해 Broadcast Upload Extension 또는 동등한 기능을 구현해야 합니다.
- Broadcast Upload Extension을 구현하려면 Xcode에서 프로젝트에 새 Target을 추가하고, "Broadcast Upload Extension" 템플릿을 선택한 뒤 확장을 활성화하세요.
- 화면 공유 스트림 전송에 사용할 포트 번호, 수신 토큰, 송신 토큰을 정의하세요.
1대1 통화
프레젠테이션 시작
iOS 1대1 통화에서 프레젠테이션을 시작하는 흐름은 다음과 같습니다.
프레젠테이션 중지
iOS 1대1 통화에서 프레젠테이션을 중지하는 흐름은 다음과 같습니다.
그룹 통화
프레젠테이션 시작
iOS 그룹 통화에서 프레젠테이션을 시작하는 흐름은 다음과 같습니다.
프레젠테이션 중지
iOS 그룹 통화에서 프레젠테이션을 중지하는 흐름은 다음과 같습니다.
관련 API
프레젠테이션 기능과 관련된 API는 다음과 같습니다.
1대1 통화
메서드
PlanetKitCall의startMyScreenShare()(Android)PlanetKitCall의stopMyScreenShare()(Android)PlanetKitMakeCallParamBuilder의setScreenShareKey()(iOS)PlanetKitVerifyCallParamBuilder의setScreenShareKey()(iOS)-
PlanetKitCall의addPeerScreenShareView() -
PlanetKitCall의removePeerScreenShareView()
이벤트
-
onPeerScreenShareStarted -
onPeerScreenShareStopped -
PlanetKitMyMediaStatusHandler의onScreenShareStateUpdate
그룹 통화
메서드
PlanetKitConference의startMyScreenShare()(Android)PlanetKitConference의stopMyScreenShare()(Android)PlanetKitJoinConferenceParamBuilder의setScreenShareKey()(iOS)-
PlanetKitPeerControl의startScreenShare() -
PlanetKitPeerControl의stopScreenShare()