グループビデオ通話
グループビデオ通話を実装するサンプルコードです。
前提条件
開始する前に、次の作業が必要です。
- PlanetKitを初期化してください。
- 適切なアクセストークンを取得してください。
- グループ通話フローにて、APIを使用するための全般的なプロセスを確認してください。
グループビデオ通話実装時の考慮事項
joinConference()
を呼び出した後、返却されたPlanetKitConferenceResult
のreason
プロパティを確認する必要があります。
reason
がPlanetKitStartFailReason.NONE
の場合、成功を意味します。- それ以外は失敗を意味し、
reason
に応じて適切に処理する必要があります。
権限申請
通話をする前に、次のランタイム権限を取得してください。
Manifest.permission.READ_PHONE_STATE
Manifest.permission.RECORD_AUDIO
Manifest.permission.BLUETOOTH_CONNECT
(targetSdkVersion
31以上)Manifest.permission.CAMERA
変数の用意
主要プロパティとイベントリスナーに対する変数を用意します。
PlanetKitMyMediaStatusListener
は、ローカルユーザーのメディアステータス変更イベントを処理するのに使用されます。マイクがミュートもしくはミュート解除された場合やオーディオの説明が更新された場合、ビデオのステータスが変更された場合など、イベントに基づいてローカルユーザーのUIを更新できます。
val myUserId = "test user id" // The local user's user ID
val serviceId = "test service id" // Service ID
// PlanetKitMyMediaStatusListener object
val myMediaStatusListener = object : PlanetKitMyMediaStatusListener {
override fun onMyAudioMuted() {
// This is called when the local user's audio is muted.
// Write your own code here.
}
override fun onMyAudioUnmuted() {
// This is called when the local user's audio is unmuted.
// Write your own code here.
}
override fun onMyAudioDescriptionUpdated(audioDescription: PlanetKitAudioDescription) {
// This is called when the local user's audio description is updated.
// Write your own code here.
}
override fun onVideoStatusUpdated(videoStatus: PlanetKitVideoStatus) {
// This is called when the local user's video status is updated.
// Write your own code here.
}
}
ローカルユーザーのビデオプレビュー
プレビュー機能を使用すると、ローカルユーザーがグループ通話セッションに関係なく、自分のビデオをプレビューできます。
ローカルユーザーのビデオプレビューを開始するには、PlanetKitCameraManager
のをstartPreview()
呼び出します。
fun startPreviewExample(preview: PlanetKitVideoView)
{
PlanetKit.getCameraManager().startPreview(preview)
}
ローカルユーザーのビデオプレビューを中止するには、PlanetKitCameraManager
のをstopPreview()
呼び出します。
fun stopPreviewExample(preview: PlanetKitVideoView)
{
PlanetKit.getCameraManager().stopPreview(preview)
}
グループ通話参加
グループ通話に参加するには、適切なPlanetKitConferenceParam
と共にPlanetKit.joinConference()
を呼び出します。PlanetKitConferenceParam
を作成するには、PlanetKitConferenceParam.Builder()
を使用してください。
- グループビデオ通話に参加するように
PlanetKitMediaType.AUDIOVIDEO
を引数としてPlanetKitConferenceParam.Builder
のmediaType()
を呼び出します。 - ローカルユーザーのビデオの初期状態は、
PlanetKitConferenceParam.Builder
のsetInitialMyVideoState()
で設定できます。initialMyVideoState
プロパティのデフォルト値は、PlanetKitInitialMyVideoState.RESUME
です。PlanetKitInitialMyVideoState.PAUSE
を引数としてsetInitialMyVideoState()
を呼び出してローカルユーザーのビデオの初期状態が一時停止に設定された場合、ローカルユーザーのビデオは送信されません。この場合、ローカルユーザーのビデオは通話が接続された後、resumeMyVideo()
を呼び出して送信できます。
fun joinConferenceExample(roomId: String, accessToken: String, initialMyVideoState: PlanetKitInitialMyVideoState)
{
val param = PlanetKitConferenceParam.Builder()
.myId(myUserId)
.roomId(roomId)
.myServiceId(serviceId)
.roomServiceId(serviceId)
.accessToken(accessToken)
.mediaType(PlanetKitMediaType.AUDIOVIDEO)
.setInitialMyVideoState(initialMyVideoState)
.build()
val result = PlanetKit.joinConference(param, conferenceListener = object : ConferenceListener {
override fun onConnected(conference: PlanetKitConference,
isVideoHwCodecEnabled: Boolean,
isVideoShareModeSupported: Boolean) {
// This is called when the call is connected.
// Write your own code here.
}
override fun onDisconnected(conference: PlanetKitConference,
param: PlanetKitDisconnectedParam) {
// This is called when the call is disconnected.
// Write your own code here.
}
override fun onPeerListUpdated(param: PlanetKitConferencePeerListUpdatedParam) {
// This is called when the list of peers is updated.
// The following is an example function. For more information, see the "Manage peers using PlanetKitPeerControl" section.
handlePeerListUpdate(param)
}
override fun onPeersVideoUpdated(conference: PlanetKitConference, param: PlanetKitConferenceVideoUpdateParam) {
// This is called when the video of one or more peers is updated.
// Write your own code here.
}
})
if (result.reason == PlanetKitStartFailReason.NONE) {
// The "result.conference" instance is the main instance to call APIs from now on.
// You must keep it to control this call.
}
else {
// Handle an error by referring to result.reason.
}
}
ローカルユーザーに対するメディアステータスリスナーの設定(任意)
通話が接続されると、必要に応じてローカルユーザーに対するメディアステータスリスナーを設定します。
fun setMyMediaStatusListenerExample(): Boolean
{
var conference = PlanetKit.getConference() ?: return false
conference.getMyMediaStatus()?.addHandler(myMediaStatusListener, null) {
}
return true
}
ローカルユーザーのためのビデオビュー追加
addMyVideoView()
を呼び出してローカルユーザーのビデオがレンダリングされるビデオビューを追加します。ビデオのレンダリングは、ローカルユーザーのビデオ状態によって、開始または中止されます。
fun addMyVideoViewExample(myVideoView: PlanetKitVideoView): Boolean
{
var conference = PlanetKit.getConference() ?: return false
conference.addMyVideoView(myVideoView)
return true
}
ピアのためのビデオビュー追加
addPeerVideoView()
を呼び出してピアのビデオがレンダリングされるビデオビューを追加します。
fun addPeerVideoViewExample(peer: PlanetKitConferencePeer, peerVideoView: PlanetKitVideoView): Boolean
{
var conference = PlanetKit.getConference() ?: return false
conference.addPeerVideoView(peer, peerVideoView)
return true
}
各ピアに対するピアコントロールの作成
ピアリストが更新されたら、新たに追加されたピアに対してPlanetKitPeerControl
を作成し、PeerControlListener
オブジェクトを登録してください。PeerControlListener
を使用して各ピアのステータス変更を処理できます。
class PeerContainer internal constructor(
peer: PlanetKitConferencePeer
) {
val peerControl: PlanetKitPeerControl = peer.createPeerControl()
?: throw IllegalStateException("Failed to create peer control.")
init {
val peerControlListener = object : PlanetKitPeerControl.PeerControlListener {
override fun onMicMuted(peer: PlanetKitConferencePeer) {
// This is called when the peer's audio is muted.
// Write your own code here.
}
override fun onMicUnmuted(peer: PlanetKitConferencePeer) {
// This is called when the peer's audio is unmuted.
// Write your own code here.
}
override fun onAudioDescriptionUpdated(
peer: PlanetKitConferencePeer,
audioDescription: PlanetKitAudioDescription
) {
// This is called when the peer's audio description is updated.
// Write your own code here. The following is an example of implementation.
val yourOwnThresholdTalkingVolumeLevel = 10
val isPeerTalking =
audioDescription.averageVolumeLevel >= yourOwnThresholdTalkingVolumeLevel
}
override fun onVideoUpdated(
peer: PlanetKitConferencePeer,
videoStatus: PlanetKitVideoStatus,
subgroupName: String?
) {
// This is called when the peer's video is updated.
// Write your own code here. The following is an example of implementation.
when (videoStatus.videoState) {
PlanetKitVideoStatus.VideoState.DISABLED -> {
// The peer's video is disabled.
// The video stops even if you don't call peerControl.stopVideo().
}
PlanetKitVideoStatus.VideoState.ENABLED -> {
// The peer's video is enabled.
// If you call peerControl.startVideo(), the peer's video is received and rendered.
peerControl.startVideo(
PlanetKitVideoResolution.RECOMMENDED,
subgroupName
)
}
PlanetKitVideoStatus.VideoState.PAUSED -> {
// Write your own code for paused video.
}
}
}
override fun onDisconnected(peer: PlanetKitConferencePeer) {
// This is called when the peer is disconnected from the call.
// Write your own code here.
}
}
peerControl.register(peerControlListener)
}
}
// Example function called in the onPeerListUpdated callback.
private val peerContainerList = mutableListOf<PeerContainer>()
fun handlePeerListUpdate(param: PlanetKitConferencePeerListUpdatedParam) {
// Process added peers.
for (addedPeer in param.addedPeers) {
// Create peer control for your class.
peerContainerList.add(PeerContainer(addedPeer))
}
// Process removed peers.
for (removedPeer in param.removedPeers) {
peerContainerList.removeIf {
it.peerControl.peer.isSameMember(removedPeer)
}
}
}
グループ通話退出
グループ通話から退出するには、leaveConference()
を呼び出します。
fun leaveConferenceExample(): Boolean
{
var conference = PlanetKit.getConference() ?: return false
conference.leaveConference()
return true
}