# Videocall Guide

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

[Call Flow](https://docs.omnitalk.io/commons/call-flow) 에서는 audiocall의 흐름을 sequence diagram으로 보여줍니다.

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

Developer's Guide의 [Pre-requisite](https://docs.omnitalk.io/flutter/developers-guide/pre-requisite#4.)에서 장치 설정 및 개발 공통 사항을 참고하시기 바랍니다.&#x20;

## Step 1. 세션 생성

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

```dart
await sdk.createSession();
```

## Step 2. 발신

동일한 Service Id로  세션을 생성한 사용자 중  idle state의 사용자에게 전화 요청을 할 수 있습니다.

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

* callType: 전화 타입을 의미합니다. CallType은 Omnitalk SDK에서 enum type으로 제공합니다. 영상 통화를 위해서는 `videocall` 을 전달하시면 됩니다.&#x20;
* callee:  callee의 userId를 전달하시면 됩니다.
* record: Optional 파라미터로, 녹음 여부를 의미합니다. (defalut = false)
* localRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.&#x20;
* remoteRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.

```dart
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](https://docs.omnitalk.io/commons/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 타입으로 초기화된 객체를 전달하여 전화를 수신할 수 있습니다.&#x20;

* callType: 전화 타입을 의미합니다. caller가 offerCall()을 호출할 떄와 동일하게 `videocall` 을 전달하시면 됩니다.&#x20;
* caller: caller(전화 발신자)의 userId를 전달하시면 됩니다.
* localRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.&#x20;
* remoteRenderer : RTCVideoRenderer 타입의 객체로 초기화시켜 전달합니다.

```typescript
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](https://docs.omnitalk.io/typescript/api-reference#mute-unmute)[ ](https://docs.omnitalk.io/flutter/api-reference#mute-unmute)부분을 참조 바랍니다. video mute는 자신의 영상 송출을 off 시키는 기능입니다.&#x20;

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

### 비디오 카메라 변경

전화 통화 중 비디오 장치를 전환할 수 있도록 API를 제공합니다. 사용법과 자세한 내용은 API Reference의[setVideoDevice](https://docs.omnitalk.io/flutter/api-reference#setvideodevice) 부분을 참조 바랍니다.

1. 우선, 사용 가능한 입력 장치 목록을 조회할 수 있는 [getDeviceList()](https://docs.omnitalk.io/typescript/api-reference#getdevicelist) 를 통해서 사용하고자 하는 장치의 deviceId를 획득합니다.
2. setVideoDevice()에 선택하고자는 device id를 인수로 전달하면 됩니다.&#x20;
