Videocall Guide

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

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

Step 0. SDK 초기화 및 객체 생성

Developer's Guide의 Pre-requisite에서 장치 설정 및 개발 공통 사항을 참고하시기 바랍니다.

Step 1. 세션 생성

Omnitalk SDK 초기화를 제외한 모든 API 기능은 유효한 세션의 존재를 전제로 하고 있습니다. 세션의 생성을 위해 createSession API를 호출합니다. 사용하고 싶은 번호나 문자열을 userId로 전달해 등록할 수 있으며 생략시엔 Omnitalk 서버에서 부여한 임의의 id를 리턴받을 수 있습니다.

await sdk.createSession();

Step 2. 발신

callee의 userId를 모르는 경우

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

callee의 userId를 아는 경우

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

offerCall API를 이용하여 전화 발신 요청을 할 수 있습니다. 비디오 객체의 타입 선언 및 초기화를 위해 flutter_webrtc 패키지를 import 하여 사용합니다.

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

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

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

  • localRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.

  • remoteRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.

import 'package:flutter_webrtc/flutter_webrtc.dart';

RTCVideoRenderer localvideo = RTCVideoRenderer();
RTCVIdeoRenderer remotevideo = RTCVideoRenderer();

await sdk.offerCall(
    callType:  CallType.videocall, 
    callee: callee, 
    record:false, 
    localRenderer: localVideo, 
    remoteRenderer: remoteVideo
    );

offerCall 호출 성공시 caller는 RINGBACK_EVEVT, callee는 RINGING_EVENT를 수신합니다. (Event Message 참고)

Step 3. 수신

callee가 RINGING_EVENT를 받은 경우

callee가 세션을 생성한 상태에서 caller가 offerCall(전화 요청)을 하여RINGING_EVENT를 받은 경우, callee는 자신과 상대의 영상을 담을 객체로 answerCall()을 호출하여 전화를 수신할 수 있습니다. RINGING_EVENT에서 받은 call type과 caller정보와 녹음 여부, RTCVideoRenderer 타입으로 초기화된 객체를 전달하면 됩니다. 수신 거절을 하고싶은 경우 RINGING_EVENT에서 받은 caller의 session을 인수로 전달하여 leave()를 호출하시면 됩니다.

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

callee가 세션을 생성하기 전 caller가 offerCall(전화 요청)을 하여 RINGING_EVENT를 받지 못한 경우, 애플리케이션에서 callee 에게 callType과 caller를 전달해 주어야 합니다. callee는 answerCall()을 호출하면서 callType, caller, RTCVideoRenderer 타입으로 초기화된 객체를 전달하여 전화를 수신할 수 있습니다.

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

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

  • localRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.

  • remoteRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.

await sdk.answerCall(
    callType: CallType.videocall, 
    caller: caller, 
    localRenderer: localVideo, 
    remoteRenderer: remoteVideo
    );

Step 4. 연결 성공

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

비디오 장치 제어

mute/unmute

전화 통화 중 로컬에서 송출되는 비디오 on/off 기능을 mute/unmue API를 이용하여 개발할 수 있습니다. 음소거는 TrackType.audio를 track 으로 전달해 별도의 mute API를 호출해야합니다. 사용법과 자세한 내용은 API Reference의 mute/unmute 부분을 참조 바랍니다. video mute는 자신의 영상 송출을 off 시키는 기능입니다.

await sdk.setMute(track : TrackType.video);  //비디오 송출만 off
await sdk.setUnmute(track : TrackType.video );

비디오 카메라 변경

전화 통화 중 비디오 장치를 전환할 수 있도록 API를 제공합니다. 사용법과 자세한 내용은 API Reference의setVideoDevice 부분을 참조 바랍니다.

  1. 우선, 사용 가능한 입력 장치 목록을 조회할 수 있는 getDeviceList() 를 통해서 사용하고자 하는 장치의 deviceId를 획득합니다.

  2. setVideoDevice()에 선택하고자는 device id를 인수로 전달하면 됩니다.

Last updated