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

グループビデオ通話

グループビデオ通話を実装するサンプルコードです。

前提条件

開始する前に、次の作業が必要です。

グループビデオ通話実装時の考慮事項

joinConference()を呼び出した後、返却されたPlanetKitConferenceJoinResultreasonプロパティを確認する必要があります。

  • reasonPlanetKitStartFailReason.noneの場合、成功を意味します。
  • それ以外は失敗を意味し、reasonに応じて適切に処理する必要があります。

イベントデリゲートの実装

通話で使用されるイベントデリゲート(delegate)を実装します。

  • PlanetKitConferenceDelegateは、グループ通話のステータス変更イベントを処理するのに使用されます。
  • PlanetKitMyMediaStatusDelegateは、ローカルユーザーのメディアステータス変更イベントを処理するのに使用されます。マイクがミュートもしくはミュート解除された場合やオーディオの説明がアップデートされた場合、またはビデオのステータスがアップデートされた場合など、イベントに基づいてローカルユーザーのUIをアップデートできます。
extension ConferenceDelegateExample : PlanetKitConferenceDelegate {
func didConnect(_ conference: PlanetKitConference, connected: PlanetKitConferenceConnectedParam) {

// This is called when the call is connected.
// Write your own code here.

}

func didDisconnect(_ conference: PlanetKitConference, disconnected: PlanetKitDisconnectedParam) {

// This is called when the call is disconnected.
// Write your own code here.

}

func peerListDidUpdate(_ conference: PlanetKitConference, updated: PlanetKitConferencePeerListUpdateParam) {

// This is called when the list of peers is updated.
// Write your own code here.

}


func peersVideoDidUpdate(_ conference: PlanetKitConference, updated: PlanetKitConferenceVideoUpdateParam) {

// This is called when the video of one or more peers is updated.
// Write your own code here.

}

//
// Also, you should implement other methods defined in the PlanetKitConferenceDelegate protocol.
//
...
}

extension MyMediaStatusDelegateExample: PlanetKitMyMediaStatusDelegate {
func didMuteMic(_ myMediaStatus: PlanetKitMyMediaStatus) {

// This is called when the local user's audio is muted.
// Write your own code here.

}

func didUnmuteMic(_ myMediaStatus: PlanetKitMyMediaStatus) {

// This is called when the local user's audio is unmuted.
// Write your own code here.

}

func didUpdateAudioDescription(_ myMediaStatus: PlanetKitMyMediaStatus, description: PlanetKitMyAudioDescription) {

// This is called when the local user's audio description is updated.
// Write your own code here.

}


func didUpdateVideoStatus(_ myMediaStatus: PlanetKitMyMediaStatus, status: PlanetKitVideoStatus) {

// This is called when the local user's video status is updated.
// Write your own code here.

}

//
// Also, you should implement other methods defined in the PlanetKitMyMediaStatusDelegate protocol.
//
...
}

ローカルユーザーのビデオプレビュー

プレビュー機能を使用すると、ローカルユーザーがグループ通話セッションに関係なく、自分のビデオをプレビューできます。

ローカルユーザーのビデオプレビューを開始するには、PlanetKitCameraManagerのをstartPreview()呼び出します。

func startPreviewExample(delegate: PlanetKitVideoOutputDelegate)
{
PlanetKitCameraManager.shared.startPreview(delegate)
}

ローカルユーザーのビデオプレビューを中止するには、PlanetKitCameraManagerのをstopPreview()呼び出します。

func stopPreviewExample(delegate: PlanetKitVideoOutputDelegate)
{
PlanetKitCameraManager.shared.stopPreview(delegate)
}

通話に参加

グループ通話に参加するための手順は次のとおりです。

  1. PlanetKitJoinConferenceSettingBuilderを通じて設定情報を作成します。
  2. PlanetKitConferenceDelegateを含めてPlanetKitConferenceParamを作成し、mediaTypeプロパティを.audiovideoに設定します。
  3. PlanetKitManager.shared.joinConference()を呼び出します。
  4. PlanetKitConferenceJoinResultを確認してください。

ローカルユーザーのビデオの初期状態は、PlanetKitConferenceParaminitialMyVideoStateプロパティに設定できます。

  • initialMyVideoStateプロパティのデフォルト値は、PlanetKitInitialMyVideoState.resumeです。
  • initialMyVideoStateプロパティをPlanetKitInitialMyVideoState.pauseに設定してローカルユーザーのビデオの初期状態が一時停止に設定された場合、ローカルユーザーのビデオは送信されません。この場合、ローカルユーザーのビデオは通話が接続された後、resumeMyVideo()を呼び出して送信できます。
class ParticipantExample
{
var conference: PlanetKitConference?
var myMediaStatusDelegate: MyMediaStatusDelegateExample
}

...

extension ParticipantExample
{
func joinConferenceExample(myId: String, myServiceId: String, roomId: String, roomServiceId: String, accessToken: String, delegate: PlanetKitConferenceDelegate, initialMyVideoState: PlanetKitInitialMyVideoState) {
let myUserId = PlanetKitUserId(id: myId, serviceId: myServiceId)

let settings = PlanetKitJoinConferenceSettingBuilder().build()
let param = PlanetKitConferenceParam(myUserId: myUserId, roomId: roomId, roomServiceId: roomServiceId, displayName: nil, delegate: delegate, accessToken: accessToken)
param.mediaType = .audiovideo
param.initialMyVideoState = initialMyVideoState

let result = PlanetKitManager.shared.joinConference(param: param, settings: settings)

guard result.reason == .none else {
NSLog("Failed reason: result. \(result.reason)")
return
}

// The result.conference instance is a conference instance for calling other APIs from now on.
// You must keep this instance in your own context.
// In this example, the "conference" variable holds the instance.
conference = result.conference
}
}

ローカルユーザーに対するメディアステータスのイベントデリゲート設定

通話が接続されると、ローカルユーザーに対するメディアステータスのイベントデリゲートを設定します。

extension ParticipantExample
{
func addMyMediaStatusHandlerExample() {
conference.myMediaStatus.addHandler(myMediaStatusDelegate) {
// completion callback
}
}
}

ローカルユーザーのためのビデオビュー追加

ローカルユーザーのためのビデオビューを追加するには、PlanetKitMTKViewインスタンス(myVideoView)を作成し、ローカルビューにサブビューとして追加した後、PlanetKitVideoStreamaddReceiver()でローカルユーザーのビデオストリームを受信するように設定します。

ビデオのレンダリングは、ローカルユーザーのビデオ状態によって、開始または中止されます。

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

extension YourConferenceViewController {

@IBOutlet weak var localView: UIView!

var conference: PlanetKitConference!

...

func addMyVideoViewExample()
{
let myVideoView = PlanetKitMTKView(frame: localView.bounds, device: nil)
localView.addSubview(myVideoView)

conference.myVideoStream.addReceiver(myVideoView)
}
}

ピアのためのビデオビュー追加

ピアのためのビデオビューを追加するには、PlanetKitMTKViewインスタンス(peerVideoView)を作成し、ピアビューにサブビューとして追加します。

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

class YourPeerView: UIView {

@IBOutlet weak var peerView: UIView!

var peerVideoView: PlanetKitMTKView!

...

override public func awakeFromNib() {
super.awakeFromNib()

peerVideoView = PlanetKitMTKView(frame: peerView.bounds, device: nil)
peerVideoView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
peerView.addSubview(peerVideoView)
}
}

各ピアに対するピアコントロールの作成

ピアリストが更新されたら、新たに追加されたピアに対してPlanetKitPeerControlを作成し、PlanetKitPeerControlDelegateオブジェクトを登録してください。PlanetKitPeerControlDelegateを使用して各ピアのステータス変更を処理できます。

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

class YourPeerView: UIView {

...

var peerControl: PlanetKitPeerControl?
var peerVideoView: PlanetKitMTKView!

...

func setupPeerControl(for peer: PlanetKitConferencePeer, in conference: PlanetKitConference) {
guard let peerControl = conference.createPeerControl(peer: peer) else {
return
}

peerControl.register(self) { success in
// Write your own code here.
}
self.peerControl = peerControl
}

func setVideoEnabled(_ enable: Bool) {
if enable {
peerControl.startVideo(maxResolution: .recommended, delegate: peerVideoView) { success in
// Write your own code here.
}
}
else {
peerControl.stopVideo() { success in
// Write your own code here.
}
}
}
}

extension YourPeerView: PlanetKitPeerControlDelegate {

func didMuteMic(_ peerControl: PlanetKitPeerControl) {

// This is called when the local user's audio is muted.
// Write your own code here.

}

func didUnmuteMic(_ peerControl: PlanetKitPeerControl) {

// This is called when the local user's audio is unmuted.
// Write your own code here.

}

func didUpdateVideo(_ peerControl: PlanetKitPeerControl, subgroup: PlanetKitSubgroup, status: PlanetKitVideoStatus) {
DispatchQueue.main.async {
self.setVideoEnabled(status.isEnabled)

// This is called when the local user's video status is changed.
// Write your own code here.
}
}

//
// Also, you should implement other methods defined in the PlanetKitPeerControlDelegate protocol.
//
...
}

グループ通話退出

グループ通話から退出するには、leaveConference()を呼び出します。

extension ParticipantExample
{
func leaveConferenceExample() {
conference?.leaveConference()
}
}

関連サンプルコード

関連ドキュメント