# Video Room

videoroom은 영상 회의 기능을 인터넷을 이용한 애플리케이션으로 구현한 것입니다. Omnitalk SDK를 사용하여 회의실(룸) 생성 및 참여, 이벤트 메시지에 대응하는 것으로 음성 회의 기능을 간단히 구현할 수 있습니다.

## Step 1. 세션 생성

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

```typescript
await sdk.createSession(user_id);
```

## Step 2. 회의실 생성 / 조회

[createRoom()](https://docs.omnitalk.io/api-reference#createroom) API 를 사용하여 사람들이 입장 할 수 있는 회의실(룸)을 생성합니다. createRoom()의 필수 파라미터은 room\_type은 Omnitalk SDK에서 enum type으로 제공합니다. 영상 회의의 경우는 `VIDEO_ROOM` 을 사용하시면 됩니다. createRoom() API 리턴 객체에 room\_id 로 회의실에 참여할 수 있습니다.

```typescript
await sdk.createRoom(VIDEOROOM_TYPE.VIDEO_ROOM, "subject", "123456")
```

이미 다른 사용자가 회의실을 생성 했다면 [roomList()](https://docs.omnitalk.io/api-reference#roomlist) API 를 사용하여 현재 생성된 회의실 목록을 조회할 수 있습니다. 음성 회의실 목록만 조회하고 싶은 경우 room\_type 을 `VIDEO_ROOM` 으로 전달하시면 됩니다. 조회한 목록 결과에 room\_id 로 회의실에 참여할 수 있습니다.

```typescript
await sdk.roomList(VIDEOROOM_TYPE.VIDEO_ROOM);
```

## Step 3. 회의실 참여

[joinRoom()](https://docs.omnitalk.io/api-reference#joinroom) API 를 사용하여 회의실에 참여할 수 있습니다. 회의실에 참여하게 되면 별도의 작업 없이 참여자들과 음성 회의를 할 수 있게 되며, 영상 송출은 다음 스텝을 참고 바랍니다. 회의실에 관련된 이벤트 메세지를 수신할 수 있습니다. 영상 회의에서 수신 가능한 이벤트는 아래와 같습니다. 자세한 내용은 [Event Message](https://docs.omnitalk.io/commons/event-message) 를 참조 바랍니다.

* CONNECTED\_EVENT - 새로운 참가자 입장했을 때
* BROADCASTING\_EVENT - 다른 참가자가 영상을 송출했을 때
* LEAVE\_EVENT - 다른 참가자가 퇴장 했을 때
* MUTE\_EVENT - 다른 참가자가 mute 했을 때
* UNMUTE\_EVENT - 다른 참가자가 unmute 했을 때
* SCREEN\_SHARE\_EVENT - 화면 공유 발생 이벤트
* SCREEN\_UNSHARE\_EVENT - 화면 공유 종료 이벤트
* MESSAGE\_EVENT - 채팅 메세지 수신 이벤트, 회의실 입장시 채팅 기능을 사용할 수 있는 상태가 됩니다. 채팅기능 사용법은 [Chatting](https://docs.omnitalk.io/typescript/developers-guide/chatting) 문서를 참조 바랍니다.

```typescript
await sdk.joinRoom(room_id);
```

## Step 4. 영상 송출

### 카메라 영상

[publish()](https://docs.omnitalk.io/api-reference#publish) API 를 사용하여 카메라 영상을 송출할 수 있습니다. 송출되는 영상을 재생하기 위해서는 video 태그가 필요합니다. Omnitalk SDK는 video 태그의 id를 기반으로 영상을 재생합니다. 파라미터로 사용자 지정 tag id를 전달할 수 있습니다. 사용자 지정 tag id를 전달하지 않으면 옴니톡 SDK에서 발급한 [Tag Rule](#audio-video-tag-rule)에 따라서 video 태그를 생성하시면 됩니다.

publish를 하게 되면 다른 참가자들은 `BROADCASTING_EVENT` 이벤트 메세지를 받게 됩니다. 방송 구독은 다음 스텝을 참고 바랍니다.

```typescript
await sdk.publish(tag_id);
```

### 화면 공유

[screenShare()](https://docs.omnitalk.io/api-reference#screenshare) API 를 사용하여 사용자의 화면을 공유할 수 있습니다. 송출되는 영상을 재생하기 위해서는 video 태그가 필요합니다. Omnitalk SDK는 video 태그의 id를 기반으로 영상을 재생합니다. 파라미터로 사용자 지정 tag id를 전달할 수 있습니다. 사용자 지정 tag id를 전달하지 않으면 옴니톡 SDK에서 발급한 [Tag Rule](#audio-video-tag-rule)에 따라서 video 태그를 생성하시면 됩니다.

screenShare를 하게 되면 다른 참가자들은 `SCREEN_SHARE_EVENT` 이벤트 메세지를 받게 됩니다. 방송 구독은 다음 스텝을 참고 바랍니다.

```typescript
await sdk.screenShare(tag_id);
```

### 화면 공유 취소

screenUnshare를 하게 되면 화면 공유를 중단합니다. 다른 참가자들은 `SCREEN_UNSHARE_EVENT` 이벤트 메세지를 받게 됩니다.&#x20;

```typescript
await sdk.screenUnshare();
```

## Step 5. 영상 구독

[subscribe()](https://docs.omnitalk.io/api-reference#subscribe) API 를 사용하여 송출된 영상을 구독할 수 있습니다. 파라미터에 영상 송출자의 session 을 전달하시면 됩니다. session은 partiList() API 또는 `BROADCASTING_EVENT` 또는 `SCREEN_SHARE_EVENT` 에서 확인 하실 수 있습니다.

송출되는 영상을 재생하기 위해서는 video 태그가 필요합니다. Omnitalk SDK는 video 태그의 id를 기반으로 영상을 재생합니다. 파라미터로 사용자 지정 tag id를 전달할 수 있습니다. 사용자 지정 tag id를 전달하지 않으면 옴니톡 SDK에서 발급한 [Tag Rule](#audio-video-tag-rule)에 따라서 video 태그를 생성하시면 됩니다.

```typescript
await sdk.subscribe(publisher_session);
```

### 영상 구독 취소

[unsubscribe()](https://docs.omnitalk.io/api-reference#unsubscribe) API 를 사용하여 구독중이던 영상을 구독 취소 할 수 있습니다.

```typescript
await sdk.unsubscribe(publisher_session);
```

## Step 6. 회의실 퇴장

[leave()](https://docs.omnitalk.io/api-reference#leave) API를 통해서 회의실에서 퇴장 할 수 있습니다. 파라미터에 session을 전달하지 않으면 자신의 방송을 종료하고 퇴장하게 됩니다. session를 전달하면 해당 session을 가진 사용자가 퇴장 하게 됩니다. 해당 상황은 수신 거절이나 강제 퇴장 등의 기능으로 활용할 수 있습니다.&#x20;

```typescript
await sdk.leave();
```

## 목록 조회

### 참여자 목록 조회

[partiList()](https://docs.omnitalk.io/api-reference#partilist) API 를 사용하여 입장한 회의실에 참여한 사용자 목록을 조회할 수 있습니다.

* 추가 예정 - partiList의 결과에 다른 참가자의 mute 여부를 알 수 있습니다.

### 방송 목록 조회

[publishList()](https://docs.omnitalk.io/api-reference#publishlist) API 를 사용하여 입장한 회의실에 송출중인 방송 목록을 조회할 수 있습니다.

### 화면공유 정보 조회

[screenList()](https://docs.omnitalk.io/api-reference#screenlist) API 를 사용하여 입장한 회의실에 송출중인 화면 공유 정보를 조회할 수 있습니다.&#x20;

## 비디오 장치 제어

### mute/unmute

영상 송출을 중단할 수 있도록 API를 제공합니다. 사용법과 자세한 내용은 API Reference의 [mute/unmute](https://docs.omnitalk.io/api-reference#mute-unmute) 부분을 참조 바랍니다. mute/unmute API의 파라미터인 track type은 Omnitalk SDK에서 enum type으로 제공합니다. 예시는 아래와 같습니다.

```typescript
await sdk.setMute(TRACK_TYPE.VIDEO);
```

### 입력 장치 변경

전화 연결 전, 또는 영상 전화 통화중에 입력(카메라) 장치를 변경할 수 있도록 API를 제공합니다.&#x20;

1. 우선, 사용 가능한 입력 장치 목록을 조회할 수 있는 [getDeviceList()](https://docs.omnitalk.io/api-reference#getdevicelist) 를 통해서 사용하고자 하는 장치의 deviceId를 획득합니다.
2. [setVideoDevice()](https://docs.omnitalk.io/api-reference#setvideodevice) 파라미터로 deviceId를 전달하여 입력 장치를 변경할 수 있습니다.

## 오디오 장치 제어

### mute/unmute

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

```typescript
await sdk.setMute(TRACK_TYPE.AUDIO);
```

### 입력 장치 변경

전화 연결 전, 또는 전화 통화중에 입력(마이크) 장치를 변경할 수 있도록 API를 제공합니다.&#x20;

1. 우선, 사용 가능한 입력 장치 목록을 조회할 수 있는 [getDeviceList()](https://docs.omnitalk.io/api-reference#getdevicelist) 를 통해서 사용하고자 하는 장치의 deviceId를 획득합니다.
2. [setAudioDevice()](https://docs.omnitalk.io/api-reference#setaudiodevice) 파라미터로 deviceId를 전달하여 입력 장치를 변경할 수 있습니다.

## 룸 삭제

현재 참여중이지 않은 회의실은 [destroyRoom()](https://docs.omnitalk.io/api-reference#destroyroom) API 를 사용하여 회의실을 삭제할 수 있습니다.
