그룹 영상 통화
그룹 영상 통화를 구현하는 예제 코드입니다.
필수 조건
시작하기 전에 다음 작업을 수행해야 합니다.
- PlanetKit을 초기화하세요.
- 적절한 액세스 토큰을 획득하세요.
- 그룹 통화 흐름에서 전반적인 API 사용 과정을 확인하세요.
그룹 영상 통화 구현 시 고려 사항
joinConference()
를 호출한 다음에는 반환된 PlanetKitConferenceJoinResult
의 reason
속성을 확인해야 합니다.
reason
이PlanetKitStartFailReason.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)
}
통화 입장
그룹 통화에 입장하기 위한 절차는 다음과 같습니다.
PlanetKitJoinConferenceSettingBuilder
를 통해 설정 정보를 만드세요.PlanetKitConferenceDelegate
를 포함하여PlanetKitConferenceParam
을 생성하고,mediaType
속성을.audiovideo
로 설정하세요.PlanetKitManager.shared.joinConference()
를 호출하세요.PlanetKitConferenceJoinResult
를 확인하세요.
로컬 사용자의 초기 비디오 상태는 PlanetKitConferenceParam
의 initialMyVideoState
속성으로 설정할 수 있습니다.
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
)를 생성하고 로컬 뷰에 하위 뷰로 추가한 다음 PlanetKitVideoStream
의 addReceiver()
로 로컬 사용자의 비디오 스트림을 받도록 설정하세요.
비디오 렌더링은 로컬 사용자의 비디오 상태에 따라 시작되거나 중지됩니다.
#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()
}
}