본문으로 건너뛰기
Version: 6.0

그룹 통화 화면 공유

그룹 통화(컨퍼런스)에서 화면 공유를 구현하는 예제 코드입니다.

송신 측 - 화면 공유 전송 시작

화면 공유를 시작하기 위한 코드 구현 방식은 다음과 같습니다.

화면 캡처 장치를 모으고 그중 하나를 선택하세요.

func collectCaptureDevices() -> [PlanetKitScreenCaptureDevice] {
var captureDevices = [PlanetKitScreenCaptureDevice]()
autoreleasepool {
for display in PlanetKitScreen.shared.displays {
let name: String
if let screen = NSScreen.screens.first(where: { $0.displayID == display.displayID }) {
name = screen.localizedName
}
...

captureDevices.append(PlanetKitScreenCaptureDevice(display: display))
}

let windows = PlanetKitScreen.shared.windows.filter {
$0.sharingType != .none &&
$0.alpha > 0 &&
$0.level == kCGNormalWindowLevel
}
let myAppId = Bundle.main.bundleIdentifier
for window in windows {
guard let image = window.image, window.sharingType != .none, window.bundleId != nil else {
continue
}
if myAppId == window.bundleId {
continue
}
...

captureDevices.append(PlanetKitScreenCaptureDevice(window: window))
}
}
return captureDevices
}

화면 공유 전송을 시작하려면 startMyScreenShare()를 호출하세요.

  • subgroupName 파라미터는 화면 공유가 전송될 목적지를 결정합니다.
  • subgroupName 파라미터가 nil이면 화면 공유가 기본 방(main room)으로 전송됩니다.
func startMyScreenShare(_ device: PlanetKitScreenCaptureDevice) {
...

conference.startMyScreenShare(device: device, subgroupName: nil) { success in
guard success else { return }
// UI code here if success
}
}

송신 측 - 화면 공유 목적지 변경하기

화면 공유의 목적지는 목적지 유형에 따라 다음과 같이 변경할 수 있습니다.

  • 기본 방이 아닌 다른 서브그룹으로 목적지를 변경하려면 서브그룹 이름을 인자로 changeMyScreenShareDestination()을 호출하세요.
  • 기본 방으로 목적지를 변경하려면 changeMyScreenShareDestinationToMainRoom()을 호출하세요.
// Change the destination to a subgroup other than the main room
conference.changeMyScreenShareDestination(subgroupName: subgroupName) { success in
guard success else { return }
// UI code here if success
}

// Change the destination to the main room
conference.changeMyScreenShareDestinationToMainRoom() { success in
guard success else { return }
// UI code here if success
}

송신 측 - 화면 공유 전송 중지

화면 공유를 중지하기 위한 코드 구현 방식은 다음과 같습니다.

화면 공유를 중지하려면 stopMyScreenShare()를 호출하세요.

conference.stopMyScreenShare() { success in
self.delegate?.screenShare(self, willDismiss: dismiss)
}

수신 측 - 화면 공유 업데이트 이벤트 수신

PlanetKitConferenceDelegatescreenShareDidUpdate 이벤트를 통해 피어의 화면 공유가 시작 혹은 중지됐는지 확인합니다.

Note

이미 피어 컨트롤을 생성한 경우 다음 단계를 건너뛰고 수신 측 - 피어의 화면 공유 비디오 시작 또는 중지 단계에서 피어 컨트롤을 사용하세요. 그렇지 않으면 다음 단계와 같이 피어 컨트롤을 생성하세요.

extension VideoConferenceViewController: PlanetKitConferenceDelegate {
...
func screenShareDidUpdate(_ conference: PlanetKitConference, updated: PlanetKitConferenceScreenShareUpdateParam) {
if updated.state == .enabled {
NSLog("start screen share - \(updated.peerId) \(updated.subgroupName ?? "main")")
}
else {
NSLog("stop screen share - \(updated.peerId) \(updated.subgroupName ?? "main")")
}

// UI code here
DispatchQueue.main.async {
self.loadPage(self.currentPage)
}
}
}

수신 측 - 피어 컨트롤 생성 및 등록

피어가 통화에 연결되면 피어에 대한 피어 컨트롤을 생성하고 등록하세요.

extension VideoConferenceViewController {
...

var peers: [PlanetKitConferencePeer]
var peerViews: [ScreenPeerVideoView]

func loadPage(_ page: Int) {
...

peerViews[index].setupPeerControl(conference: conference, peer: peers[index])
}
}

#if os(macOS)
typealias UIView = NSView
#endif

class ScreenPeerVideoView: UIView {
...

var peerControl: PlanetKitPeerControl!

func setupPeerControl(conference: PlanetKitConference, peer: PlanetKitConferencePeer) {
guard let peerControl = conference.createPeerControl(peer: peer) else {
// Error code here
return
}
peerControl.register(self) { success in
// UI code here
self.setScreenShareEnabled(peer.screenShareState == .enabled)
}
self.peerControl = peerControl
}

func finalPeerControl() {
peerControl.unregister() { success in
// UI code here
}
}
}

수신 측 - 피어의 화면 공유 비디오 시작 또는 중지

PlanetKitPeerControlDelegatedidUpdateScreenShare 이벤트를 통해 피어의 화면 공유가 시작 혹은 중지됐는지 확인합니다.

  • 피어의 화면 공유가 시작되면 피어의 화면 공유 뷰를 추가하고 PlanetKitPeerControlstartScreenShare()를 호출하세요.
  • 피어의 화면 공유가 중지되면 피어의 화면 공유 뷰를 제거하고 PlanetKitPeerControlstopScreenShare()를 호출하세요.
#if os(macOS)
typealias UIView = NSView
#endif

class ScreenPeerVideoView: UIView {
...

var peerControl: PlanetKitPeerControl!
var peerScreenShareView: PlanetKitMTKView!

func setScreenShareEnabled(_ enabled: Bool) {
if enabled {
peerScreenShareView = PlanetKitMTKView(frame: view.bounds, device: nil)
view.addSubview(peerScreenShareView)

let subgroupName = peerControl.peer.currentScreenShareSubgroupName
peerControl.startScreenShare(delegate: peerScreenShareView, subgroupName: subgroupName) { success in
// UI code here
}
}
else {
peerScreenShareView.removeFromSuperview()

peerControl.stopScreenShare() { success in
// UI code here
}
}
}
}

extension ScreenPeerVideoView: PlanetKitPeerControlDelegate {
...

func didUpdateScreenShare(_ peerControl: PlanetKitPeerControl, subgroup: PlanetKitSubgroup, status: PlanetKitScreenShareStatus) {
DispatchQueue.main.async {
self.setScreenShareEnabled((status.state == .enabled))
}
}
}

관련 예제 코드

관련 문서