Video Call

videocall은 1:1 영상 통화 기능을 인터넷을 이용한 애플리케이션으로 구현한 것입니다. 통화 발신자는 caller, 착신자를 callee라는 통신 용어로 구분합니다. Omnitalk SDK를 사용하여 offerCall(), answerCall()을 각각 호출하고 해당 이벤트 메시지에 대응하는 것으로 전화 기능을 간단히 구현할 수 있습니다.

Call Flow 에서는 videocall의 흐름을 sequence diagram으로 보여줍니다.

Step 1. 세션 생성

Omnitalk SDK의 초기화를 제외한 모든 API를 사용하기 위해서는 우선적으로 createSession()을 호출하여 세션을 생성해야 합니다. createSession()의 파라미터인 userId는 사용자를 구분하기 위한 고유한 id이며 audiocall 발신을 위한 offerCall() 호출에 사용됩니다. userId는 Optional 이며, null로 전달할 경우 Omnitalk 서버에서 임의의 id를 부여합니다.

sdk.createSession(userId = "USER_ID")

Step 2. 발신

callee의 userId를 모르는 경우

수신자의 userId를 모르는 경우는 sessionList() API로 사용자 목록을 조회할 수 있습니다. 해당 API는 현재 연결중인 모든 사용자 목록을 조회할 수 있습니다(동일한 Service Id로 생성된 사용자 목록). idle state의 사용자에게 전화 요청을 할 수 있습니다.

callee의 userId를 아는 경우

해당 userId의 사용자가 idle state인 경우 전화 요청을 할 수 있습니다.

offerCall() API로 전화 요청을 할 수 있습니다. 파라미터로 callType, callee의 userId, 녹음 여부 및 자신과 상대방의 영상을 출력할 SurfaceViewRenderer 객체를 전달합니다. 해당 객체를 생성하기 위해서 org.webrtc 패키지를 import 해야 합니다. ( Omnitalk SDK 설치에 포함된 패키지 )

  • callType: 전화 타입을 의미합니다. CALL_TYPE은 Omnitalk SDK에서 enum type으로 제공합니다. 1:1 영상 통화를 위해서는 videocall 을 전달하시면 됩니다.

  • callee: 위에서 얻은 callee의 userId를 전달하시면 됩니다.

  • record: Optional 파라미터로, 녹음 여부를 의미합니다. defalut = false

  • localView: 자신의 영상을 재생할 SurfaceViewRenderer 객체

  • remoteView: 상대방의 영상을 재생할 SurfaceViewRenderer 객체

import org.webrtc.SurfaceViewRenderer
import io.omnitalk.sdk.types.PublicTypes

val callee = "test@omnistory.net"
val localView = findViewById<SurfaceViewRenderer>(R.id.localView)
val remoteView = findViewById<SurfaceViewRenderer>(R.id.remoteView)

sdk.offerCall(
    callType = PublicTypes.CALL_TYPE.videocall,
    callee = callee,
    record = true,
    localView = localView,
    remoteView = remoteView
)

offerCall 호출 성공시 caller는 RINGBACK_EVEVT, callee는 RINGING_EVENT를 수신합니다.

Step 3. 수신

Android SDK 에서는 아래 두 상황에 대해서 answerCall() API를 오버로딩하여 각각 제공합니다.

callee가 RINGING_EVENT를 받은 경우

callee가 세션을 생성한 상태에서 caller가 offerCall(전화 요청)을 하여RINGING_EVENT를 받은 경우, 영상을 재생할 객체만 answerCall() API의 파라미터로 전달하여 전화를 수신할 수 있습니다. 수신 거절을 하고싶은 경우 leave()를 호출하시면 됩니다.

  • localView: 자신의 영상을 재생할 SurfaceViewRenderer 객체

  • remoteView: 상대방의 영상을 재생할 SurfaceViewRenderer 객체

import org.webrtc.SurfaceViewRenderer

val localView = findViewById<SurfaceViewRenderer>(R.id.localView)
val remoteView = findViewById<SurfaceViewRenderer>(R.id.remoteView)
sdk.answerCall(localView = localView, remoteView = remoteView)

callee가 전화 요청(offerCall) 이후에 session을 생성한 경우

callee가 세션을 생성하기 전 caller가 offerCall(전화 요청)을 하여 RINGING_EVENT를 받지 못한 경우, callee는 answerCall()의 파라미터에 callType과 caller를 전달하여 전화를 수신할 수 있습니다. 이 경우, 애플리케이션에서 callee 에게 callType과 caller를 전달해 주어야 합니다.

  • callType: 전화 타입을 의미합니다. caller가 offerCall()을 호출할 때와 동일하게 videocall 을 전달하시면 됩니다.

  • caller: caller(전화 발신자)의 userId를 전달하시면 됩니다.

  • localView: 자신의 영상을 재생할 SurfaceViewRenderer 객체

  • remoteView: 상대방의 영상을 재생할 SurfaceViewRenderer 객체

import org.webrtc.SurfaceViewRenderer
import io.omnitalk.sdk.types.PublicTypes

val localView = findViewById<SurfaceViewRenderer>(R.id.localView)
val remoteView = findViewById<SurfaceViewRenderer>(R.id.remoteView)
sdk.answerCall(
    callType = PublicTypes.CALL_TYPE.videocall,
    caller = callerId,
    localView = localView,
    remoteView = remoteView
)

Step 4. 연결 성공

1:1 영상 통화 연결이 성공하면 caller, callee 양측 모두 CONNECTED_EVENT 를 수신합니다.

Step 5. 전화 끊기

leave() API를 통해서 전화 연결을 끊을 수 있습니다.

sdk.leave(session = null) // default: 본인 연결 끊기

비디오 장치 제어

mute/unmute

영상 전화중에 영상 송출을 중단할 수 있도록 API를 제공합니다. 사용법과 자세한 내용은 API Reference의 mute/unmute 부분을 참조 바랍니다. mute/unmute API의 파라미터인 TRACK_TYPE 은 Omnitalk SDK에서 enum type으로 제공합니다. 예시는 아래와 같습니다.

import io.omnitalk.sdk.types.PublicTypes

sdk.setMute(track = PublicTypes.TRACK_TYPE.video)

입력 장치 변경

전화 통화중에 입력(카메라) 장치를 변경할 수 있도록 switchCameraDevice() API를 제공합니다. API 호출시 후면 카메라와 전면 카메라 간 전환이 이루어 집니다. 예시는 아래와 같습니다.

sdk.switchCameraDevice()

오디오 장치 제어

mute/unmute

전화 통화중에 음소거를 할 수 있도록 API를 제공합니다. 사용법과 자세한 내용은 API Reference의 mute/unmute 부분을 참조 바랍니다. mute/unmute API의 파라미터인 TRACK_TYPE 은 Omnitalk SDK에서 enum type으로 제공합니다. 예시는 아래와 같습니다.

import io.omnitalk.sdk.types.PublicTypes

sdk.setMute(track = PublicTypes.TRACK_TYPE.audio)

입력 장치 변경

전화 통화중에 입력(마이크) 장치를 변경할 수 있도록 setAudioDevice() API를 제공합니다. 파라미터인 MIC_TYPE은 Omnitalk SDK에서 enum type으로 제공합니다. 귀에 대어 전화받는 defaultInEar 타입과 스피커폰 모드인 speaker 두 가지로 제공 됩니다. 예시는 아래와 같습니다.

import io.omnitalk.sdk.types.PublicTypes

sdk.setAudioDevice(type=PublicTypes.MIC_TYPE.speakr)

Last updated