プレゼンテーション - 画面共有
プレゼンテーションとは、発表者が他の参加者にスライドなどの資料を見せるために自分の画面を共有することを指します。ここでは、通話タイプによるプレゼンテーション機能の使い方について説明します。
| 対応する通話タイプ | SDKの最低バージョン |
|---|---|
| 1対1通話、グループ通話(カンファレンス) | PlanetKit 3.0 |
PlanetKitは、プレゼンテーション機能でHD解像度を使用しているため、クライアントのネットワーク条件が推奨帯域幅を上回っている場合に最適化されたサービスを提供できます。
1対1通話プレゼンテーション
発表者は、PlanetKitCallのstartMyScreenShare()とstopMyScreenShare()を呼び出し、プレゼンテーションを開始/終了するタイミングを決定します。
関連API
1対1通話で画面共有に関連するAPIは次のとおりです。カウンターパートとは、プレゼンテーションを見せるピアのことをいいます。
| 発表者側のAPI | 説明 | カウンターパート側のAPI | 説明 |
|---|---|---|---|
startMyScreenShare() | 発表者が画面共有を開始する | onPeerScreenShareStarted | 発表者の画面共有が開始される |
| - | - | addPeerScreenShareView() | アプリケーションが作成したビューインスタンスを設定する |
stopMyScreenShare() | 発表者が画面共有を終了する | onPeerScreenShareStopped | 発表者の画面共有が終了される |
| - | - | removePeerScreenShareView() | 解除する前にビューインスタンスを除去する |
カウンターパート側では、onPeerScreenShareStartedイベントを受け取ってプレゼンテーションが開始されたことが分かったら、必ずビューインスタンスを作成してaddPeerScreenShareView()を呼び出し、PlanetKitに画面をレンダリングさせる必要があります。
プレゼンテーションビデオのデータは、ピアに自動でストリーミングされます。
1対1通話プレゼンテーションの流れ
1対1通話でプレゼンテーションを開始する流れは次のとおりです。
1対1通話でプレゼンテーションを中止する流れは次のとおりです。
画面共有終了の理由
stopMyScreenShare()を呼び出す際に、アプリケーションの要求事項で定義した理由のうち1つを設定できます。許容される値は0から39までの整数であり、理由と値を独自に定義し、異なるプラットフォームのアプリケーション間で一貫性をもって使用する必要があります。理由が有効な値に設定されている場合、onPeerScreenShareStoppedイベントがこの値を渡します。
サンプルコード
1対1通話の画面共有機能に関するサンプルコードです。
より完全なサンプルコードは、1対1通話の画面共有を参照してください。
画面共有を開始する
// Start screen share
// screenCapturer: ScreenCapturerVideoSource instance for capturing screen content
fun startMyScreenShareExample(call: PlanetKitCall, screenCapturer: ScreenCapturerVideoSource) {
call.startMyScreenShare(screenCapturer) { result ->
Log.d(TAG, "startMyScreenShare result: ${result.isSuccessful}")
}
}
画面共有を中止する
// Stop screen share
fun stopMyScreenShareExample(call: PlanetKitCall) {
call.stopMyScreenShare { result ->
Log.d(TAG, "stopMyScreenShare result: ${result.isSuccessful}")
}
}
// Stop screen share with specific reason
// reason: User-defined reason code for stopping screen share
fun stopMyScreenShareWithReasonExample(call: PlanetKitCall, reason: Int) {
call.stopMyScreenShare(reason) { result ->
Log.d(TAG, "stopMyScreenShare(reason=$reason) result: ${result.isSuccessful}")
}
}
受信者側で画面共有イベントを処理する
// Implement related callbacks of the CallListener interface
// MakeCallListener for caller and AcceptCallListener for callee
private val makeAcceptCallListener = object : MakeCallListener, AcceptCallListener {
...
override fun onPeerScreenShareStarted(call: PlanetKitCall) {
// This is called when the peer started screen share.
// Write you own code here.
}
override fun onPeerScreenShareStopped(call: PlanetKitCall, disabledReason: Int?) {
// This is called when the peer stopped screen share.
// Write you own code here.
}
}
受信者側で画面共有ビデオをレンダリングする
fun renderPeerScreenShareVideoExample(call: PlanetKitCall, videoView: PlanetKitVideoView) {
call.addPeerScreenShareView(videoView)
}
受信者側で画面共有ビデオを削除する
fun removePeerScreenShareVideoExample(call: PlanetKitCall, videoView: PlanetKitVideoView) {
call.removePeerScreenShareView(videoView)
}
グループ通話プレゼンテーション
発表者は、PlanetKitConferenceのstartMyScreenShare()とstopMyScreenShare()を呼び出し、プレゼンテーションを開始/終了するタイミングを決定します。
関連API
グループ通話で画面共有に関連するAPIは次のとおりです。カウンターパートとはグループ通話でプレゼンテーションを見せる参加者のことをいいます。
| 発表者側のAPI | 説明 | カウンターパート側のAPI | 備考 |
|---|---|---|---|
startMyScreenShare() | 発表者が画面共有を開始する | ConferenceListenerのonScreenShareUpdatedPeerControlListenerのonScreenShareUpdated(state=ENABLED) | 発表者の画面共有が開始される |
| - | - | addPeerScreenShareView() | アプリケーションが作成したビューインスタンスを設定する |
| - | - | PlanetKitPeerControlのstartScreenShare() | 画面共有ビューで画面共有ビデオのレンダリングを開始する |
stopMyScreenShare() | 発表者が画面共有を終了する | ConferenceListenerのonScreenShareUpdatedPeerControlListenerのonScreenShareUpdated(state=DISABLED) | 発表者の画面共有が終了される |
| - | - | removePeerScreenShareView() | 解除する前にビューインスタンスを除去する |
| - | - | PlanetKitPeerControlのstopScreenShare() | 画面共有ビューで画面共有ビデオのレンダリングを中断する |
changeMyScreenShareDestination()changeMyScreenShareDestinationToMainRoom() | 画面を共有する対象のサブグループを変更する | ConferenceListenerのonScreenShareUpdatedPeerControlListenerのonScreenShareUpdated(state=ENABLED または DISABLED) | 特定のサブグループへの画面共有が開始/終了される |
ピアの画面共有ビューで画面共有ビデオを制御するために、PlanetKitPeerControlのメソッドを使用することができます。画面共有ビデオ制御のためにPlanetKitPeerControlを使用する方法について詳しくは、グループ通話画面共有のサンプルコードを参照してください。
ConferenceListenerのonScreenShareUpdatedイベントまたはPeerControlListenerのonScreenShareUpdatedイベントを受信してプレゼンテーションが開始されたことが分かったら(state=ENABLED)、カウンターパート側では必ずaddPeerScreenShareView()でビューを設定してPlanetKitPeerControlのstartScreenShare()を呼び出し、PlanetKitに画面をレンダリングさせる必要があります。
1対1通話とは異なり、プレゼンテーションのビデオデータを参加者に自動でストリーミングすることはありません。したがって、グループ通話のカウンターパート側は共有画面ビデオを受信するために、必ずPlanetKitPeerControlのstartScreenShare()を呼び出す必要があります。
グループ通話プレゼンテーションの流れ
グループ通話でプレゼンテーションを開始する流れは次のとおりです。
グループ通話でプレゼンテーションを中止する流れは次のとおりです。
グループ通話でプレゼンテーションが開始された後に参加したユーザーの流れは次のとおりです。
画面共有終了の理由
stopMyScreenShare()を呼び出す際に、アプリケーションの要求事項で定義した理由のうち1つを設定できます。許容される値は0から39までの整数であり、理由と値を独自に定義し、異なるプラットフォームのアプリケーション間で一貫性をもって使用する必要があります。理由が有効な値に設定されている場合、onScreenShareUpdatedとonScreenShareUpdatedイベントがこの値を渡します。
サブグループ内のプレゼンテーション
「dataSession」プロパティをtrueに設定してサブグループに加入すると、サブグループ内でプレゼンテーションを使用できます。サブグループ範囲内でプレゼンテーションを開始すると、プレゼンテーションビデオのデータはサブグループメンバーだけに共有されます。
画面共有の対象となるサブグループを変更するには、changeMyScreenShareDestination()またはchangeMyScreenShareDestinationToMainRoom()を使用します。詳しくは、サブグループフロー - 画面共有を参照してください。
PlanetKitは同時に2つの画面を共有する機能を提供します。2つのプレゼンテーションビデオを受信すると、UXが混乱したり、トラフィックが多くなったりする可能性はありますが、サブグループ機能と連携して便利な使い方ができます。
たとえば、最初の発表者が参加者全員に対してプレゼンテーションを実施し、次の発表者がサブグループ範囲内でプレゼンテーションを実施するとします。サブグループのメンバーは、PlanetKitPeerControlのstartScreenShare()を調整して、いずれかの画面を受信するか、または両方とも受信するかを選択できます。
サンプルコード
グループ通話の画面共有機能に関するサンプルコードです。
より完全なサンプルコードは、グループ通話の画面共有を参照してください。
画面共有を開始する
// Start screen share to main room
// screenCapturer: ScreenCapturerVideoSource instance for capturing screen content
fun startMyScreenShareExample(conference: PlanetKitConference, screenCapturer: ScreenCapturerVideoSource) {
conference.startMyScreenShare(screenCapturer) { result ->
Log.d(TAG, "startMyScreenShare result: ${result.isSuccessful}")
}
}
// Start screen share to specific subgroup
// subgroupName: Target subgroup name, or null for main room
fun startMyScreenShareToSubgroupExample(
conference: PlanetKitConference,
screenCapturer: ScreenCapturerVideoSource,
subgroupName: String?
) {
conference.startMyScreenShare(screenCapturer, subgroupName) { result ->
Log.d(TAG, "startMyScreenShare(subgroup=$subgroupName) result: ${result.isSuccessful}")
}
}
画面共有を中止する
// Stop screen share
fun stopMyScreenShareExample(conference: PlanetKitConference) {
conference.stopMyScreenShare { result ->
Log.d(TAG, "stopMyScreenShare result: ${result.isSuccessful}")
}
}
// Stop screen share with specific reason
// reason: User-defined reason code for stopping screen share
fun stopMyScreenShareWithReasonExample(conference: PlanetKitConference, reason: Int) {
conference.stopMyScreenShare(reason) { result ->
Log.d(TAG, "stopMyScreenShare(reason=$reason) result: ${result.isSuccessful}")
}
}
画面共有のターゲットを変更する
// Change screen share destination to a specific subgroup
// toSubgroupName: Target subgroup name to change to
fun changeScreenShareDestinationExample(conference: PlanetKitConference, toSubgroupName: String) {
conference.changeMyScreenShareDestination(toSubgroupName) { result ->
Log.d(TAG, "changeMyScreenShareDestination(to=$toSubgroupName) result: ${result.isSuccessful}")
}
}
// Change screen share destination to main room
fun changeScreenShareDestinationToMainRoomExample(conference: PlanetKitConference) {
conference.changeMyScreenShareDestinationToMainRoom { result ->
Log.d(TAG, "changeMyScreenShareDestinationToMainRoom result: ${result.isSuccessful}")
}
}
受信者側で画面共有イベントを処理する
// Implement related callback of ConferenceListener
private val conferenceListener = object : ConferenceListener {
...
override fun onScreenShareUpdated(
peer: PlanetKitConferencePeer,
subgroupName: String?,
screenShareState: PlanetKitScreenShareState,
disabledReason: Int?
) {
// This is called when a peer's screen share state changes.
when (state) {
PlanetKitScreenShareState.ENABLED -> {
Log.d(TAG, "Peer started screen share")
// Add your own code here
}
PlanetKitScreenShareState.DISABLED -> {
Log.d(TAG, "Peer stopped screen share")
// Add your own code here
}
}
}
}
// Implement related callback of PeerControlListener
private val peerControlListener = object : PlanetKitPeerControl.PeerControlListener {
...
override fun onScreenShareUpdated(
peer: PlanetKitConferencePeer,
state: PlanetKitScreenShareState,
subgroupName: String?,
disabledReason: Int?
) {
// This is called when the peer's screen share state changes.
when (state) {
PlanetKitScreenShareState.ENABLED -> {
Log.d(TAG, "Peer screen share enabled")
// Add your own code here
}
PlanetKitScreenShareState.DISABLED -> {
Log.d(TAG, "Peer screen share disabled")
// Add your own code here
}
}
}
}
受信者側で画面共有ビデオを開始する
fun startPeerScreenShareVideoExample(conference: PlanetKitConference, peerControl: PlanetKitPeerControl, subgroupName: String?, videoView: PlanetKitVideoView) {
conference.addPeerScreenShareView(peerControl.peer.user, videoView)
videoView.resetFirstFrameRendered()
peerControl.startScreenShare(subgroupName) { result ->
Log.d(TAG, "startScreenShare result: ${result.isSuccessful}")
}
}
受信者側で画面共有ビデオを中止する
fun stopPeerScreenShareVideoExample(conference: PlanetKitConference, peerControl: PlanetKitPeerControl, videoView: PlanetKitVideoView) {
peerControl.stopScreenShare { result ->
Log.d(TAG, "stopScreenShare result: ${result.isSuccessful}")
}
conference.removePeerScreenShareView(peerControl.peer.user, videoView)
}