本文にスキップする
Version: 6.0

グループ通話画面共有

グループ通話(カンファレンス)で画面共有を実装するサンプルコードです。

送信側 - 画面共有の送信を開始する

画面共有を開始するためのコード実装方法は次のとおりです。

画面キャプチャーデバイスを集めて、そのうちの1つを選択します。

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))
}
}
}

関連サンプルコード

関連ドキュメント