プレゼンテーション - 画面共有
プレゼンテーションとは、発表者が他の参加者にスライドなどの資料を見せるために自分の画面を共有することを指します。ここでは、通話タイプによるプレゼンテーション機能の使い方について説明します。
| 対応する通話タイプ | SDKの最低バージョン |
|---|---|
| 1対1通話、グループ通話(カンファレンス) | PlanetKit 3.0 |
PlanetKitは、プレゼンテーション機能でHD解像度を使用しているため、クライアントのネットワーク条件が推奨帯域幅を上回っている場合に最適化されたサービスを提供できます。
1対1通話プレゼンテーション
発表者は、PlanetKitCallのstartMyScreenShare()とstopMyScreenShare()を呼び出し、プレゼンテーションを開始/終了するタイミングを決定します。
関連API
1対1通話で画面共有に関連するAPIは次のとおりです。カウンターパートとは、プレゼンテーションを見せるピアのことをいいます。
| 発表者側のAPI | 説明 | カウンターパート側のAPI | 説明 |
|---|---|---|---|
startMyScreenShare(completion:) | 発表者が画面共有を開始する | peerDidStartScreenShare(_:) | 発表者の画面共有が開始される |
| - | - | addPeerScreenShareView(delegate:) | アプリケーションが作成したビューインスタンスを設定する |
stopMyScreenShare(completion:), stopMyScreenShare(reason:completion:) | 発表者が画面共有を終了する | peerDidStopScreenShare(_:reason:) | 発表者の画面共有が終了される |
| - | - | removePeerScreenShareView(delegate:) | 解除する前にビューインスタンスを除去する |
カウンターパート側では、peerDidStartScreenShareイベントを受け取ってプレゼンテーションが開始されたことが分かったら、必ずビューインスタンスを作成してaddPeerScreenShareView()を呼び出し、PlanetKitに画面をレンダリングさせる必要があります。
プレゼンテーションビデオのデータは、ピアに自動でストリーミングされます。
1対1通話プレゼンテーションの流れ
1対1通話でプレゼンテーションを開始する流れは次のとおりです。
1対1通話でプレゼンテーションを中止する流れは次のとおりです。
画面共有終了の理由
stopMyScreenShare()を呼び出す際に、アプリケーションの要求事項で定義した理由のうち1つを設定できます。許容される値は0から39までの整数であり、理由と値を独自に定義し、異なるプラットフォームのアプリケーション間で一貫性をもって使用する必要があります。理由が有効な値に設定されている場合、peerDidStopScreenShareイベントがこの値を渡します。
サンプルコード
1対1通話の画面共有機能に関するサンプルコードです。
より完全なサンプルコードは、1対1通話の画面共有を参照してください。
画面共有を開始する
// Start screen share
func startMyScreenShareExample(call: PlanetKitCall) {
call.startMyScreenShare { success in
print("startMyScreenShare result: \(success)")
}
}
画面共有を中止する
// Stop screen share
func stopMyScreenShareExample(call: PlanetKitCall) {
call.stopMyScreenShare { success in
print("stopMyScreenShare result: \(success)")
}
}
// Stop screen share with specific reason
// reason: User-defined reason code for stopping screen share
func stopMyScreenShareWithReasonExample(call: PlanetKitCall, reason: Int32) {
call.stopMyScreenShare(reason: reason) { success in
print("stopMyScreenShare(reason=\(reason)) result: \(success)")
}
}
受信者側で画面共有イベントを処理する
extension CallDelegateExample : PlanetKitCallDelegate {
...
func peerDidStartScreenShare(_ call: PlanetKitCall) {
// This is called when the peer started screen share.
// Write you own code here.
}
func peerDidStopScreenShare(_ call: PlanetKitCall, reason: NSNumber?) {
// This is called when the peer stopped screen share.
// Write you own code here.
}
}
受信者側で画面共有ビデオをレンダリングする
func renderPeerScreenShareVideoExample(call: PlanetKitCall, view: PlanetKitMTKView) {
call.addPeerScreenShareView(delegate: view)
}
受信者側で画面共有ビデオを削除する
func removePeerScreenShareVideoExample(call: PlanetKitCall, view: PlanetKitMTKView) {
call.removePeerScreenShareView(delegate: view)
}
グループ通話プレゼンテーション
発表者は、PlanetKitConferenceのstartMyScreenShare()とstopMyScreenShare()を呼び出し、プレゼンテーションを開始/終了するタイミングを決定します。
関連API
グループ通話で画面共有に関連するAPIは次のとおりです。カウンターパートとはグループ通話でプレゼンテーションを見せる参加者のことをいいます。
ピアの画面共有ビューで画面共有ビデオを制御するために、PlanetKitPeerControlのメソッドを使用することができます。画面共有ビデオ制御のためにPlanetKitPeerControlを使用する方法について詳しくは、グループ通話画面共有のサンプルコードを参照してください。
PlanetKitConferenceDelegateのscreenShareDidUpdateイベントまたはPlanetKitPeerControlDelegateのdidUpdateScreenShareイベントを受信してプレゼンテーションが開始されたことが分かったら(state=ENABLED)、カウンターパート側では必ずaddPeerScreenShareView()でビューを設定してPlanetKitPeerControlのstartScreenShare()を呼び出し、PlanetKitに画面をレンダリングさせる必要があります。
1対1通話とは異なり、プレゼンテーションのビデオデータを参加者に自動でストリーミングすることはありません。したがって、グループ通話のカウンターパート側は共有画面ビデオを受信するために、必ずPlanetKitPeerControlのstartScreenShare()を呼び出す必要があります。
グループ通話プレゼンテーションの流れ
グループ通話でプレゼンテーションを開始する流れは次のとおりです。
グループ通話でプレゼンテーションを中止する流れは次のとおりです。
グループ通話でプレゼンテーションが開始された後に参加したユーザーの流れは次のとおりです。
画面共有終了の理由
stopMyScreenShare()を呼び出す際に、アプリケーションの要求事項で定義した理由のうち1つを設定できます。許容される値は0から39までの整数であり、理由と値を独自に定義し、異なるプラットフォームのアプリケーション間で一貫性をもって使用する必要があります。理由が有効な値に設定されている場合、screenShareDidUpdateとdidUpdateScreenShareイベントがこの値を渡します。
サブグループ内のプレゼンテーション
「dataSession」プロパティをtrueに設定してサブグループに加入すると、サブグループ内でプレゼンテーションを使用できます。サブグループ範囲内でプレゼンテーションを開始すると、プレゼンテーションビデオのデータはサブグループメンバーだけに共有されます。
画面共有の対象となるサブグループを変更するには、changeMyScreenShareDestination()またはchangeMyScreenShareDestinationToMainRoom()を使用します。詳しくは、サブグループフロー - 画面共有を参照してください。
PlanetKitは同時に2つの画面を共有する機能を提供します。2つのプレゼンテーションビデオを受信すると、UXが混乱したり、トラフィックが多くなったりする可能性はありますが、サブグループ機能と連携して便利な使い方ができます。
たとえば、最初の発表者が参加者全員に対してプレゼンテーションを実施し、次の発表者がサブグループ範囲内でプレゼンテーションを実施するとします。サブグループのメンバーは、PlanetKitPeerControlのstartScreenShare()を調整して、いずれかの画面を受信するか、または両方とも受信するかを選択できます。
サンプルコード
グループ通話の画面共有機能に関するサンプルコードです。
より完全なサンプルコードは、グループ通話の画面共有を参照してください。
画面共有を開始する
// Start screen share to main room
func startMyScreenShareExample(conference: PlanetKitConference) {
conference.startMyScreenShare(subgroupName: nil) { success in
print("startMyScreenShare result: \(success)")
}
}
// Start screen share to specific subgroup
// subgroupName: Target subgroup name, or nil for main room
func startMyScreenShareToSubgroupExample(conference: PlanetKitConference, subgroupName: String?) {
conference.startMyScreenShare(subgroupName: subgroupName) { success in
print("startMyScreenShare(subgroup=\(subgroupName ?? "main room")) result: \(success)")
}
}
画面共有を中止する
// Stop screen share
func stopMyScreenShareExample(conference: PlanetKitConference) {
conference.stopMyScreenShare { success in
print("stopMyScreenShare result: \(success)")
}
}
// Stop screen share with specific reason
// reason: User-defined reason code for stopping screen share
func stopMyScreenShareWithReasonExample(conference: PlanetKitConference, reason: Int32) {
conference.stopMyScreenShare(reason: reason) { success in
print("stopMyScreenShare(reason=\(reason)) result: \(success)")
}
}
画面共有のターゲットを変更する
// Change screen share destination to a specific subgroup
// subgroupName: Target subgroup name to change to
func changeScreenShareDestinationExample(conference: PlanetKitConference, subgroupName: String) {
conference.changeMyScreenShareDestination(subgroupName: subgroupName) { success in
print("changeMyScreenShareDestination(to=\(subgroupName)) result: \(success)")
}
}
// Change screen share destination to main room
func changeScreenShareDestinationToMainRoomExample(conference: PlanetKitConference) {
conference.changeMyScreenShareDestinationToMainRoom { success in
print("changeMyScreenShareDestinationToMainRoom result: \(success)")
}
}
受信者側で画面共有イベントを処理する
extension ConferenceDelegateExample : PlanetKitConferenceDelegate {
...
func screenShareDidUpdate(_ conference: PlanetKitConference, updated: PlanetKitConferenceScreenShareUpdateParam) {
// This is called when a peer's screen share state changes.
let state = updated.state
if state == .enabled {
print("Peer started screen share")
// Add your own code here
} else {
print("Peer stopped screen share")
// Add your own code here
}
}
}
extension PeerControlDelegateExample : PlanetKitPeerControlDelegate {
...
func didUpdateScreenShare(
_ peerControl: PlanetKitPeerControl,
subgroup: PlanetKitSubgroup,
status: PlanetKitScreenShareStatus,
disabledReason: NSNumber?
) {
// This is called when the peer's screen share state changes.
if status.state == .enabled {
print("Peer screen share enabled")
// Add your own code here
} else {
print("Peer screen share disabled")
// Add your own code here
}
}
}
受信者側で画面共有ビデオを開始する
func startPeerScreenShareVideoExample(peerControl: PlanetKitPeerControl, subgroupName: String?, peerScreenShareView: PlanetKitMTKView) {
view.addSubview(peerScreenShareView)
peerControl.startScreenShare(delegate: peerScreenShareView, subgroupName: subgroupName) { success in
print("startScreenShare result: \(success)")
}
}
受信者側で画面共有ビデオを中止する
func stopPeerScreenShareVideoExample(peerControl: PlanetKitPeerControl, peerScreenShareView: PlanetKitMTKView) {
peerScreenShareView.removeFromSuperview()
peerControl.stopScreenShare { success in
print("stopScreenShare result: \(success)")
}
}