# 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()](/typescript/api-reference.md#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()](/typescript/api-reference.md#roomlist) API 를 사용하여 현재 생성된 회의실 목록을 조회할 수 있습니다. 음성 회의실 목록만 조회하고 싶은 경우 room\_type 을 `VIDEO_ROOM` 으로 전달하시면 됩니다. 조회한 목록 결과에 room\_id 로 회의실에 참여할 수 있습니다.

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

## Step 3. 회의실 참여

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

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

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

## Step 4. 영상 송출

### 카메라 영상

[publish()](/typescript/api-reference.md#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()](/typescript/api-reference.md#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()](/typescript/api-reference.md#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()](/typescript/api-reference.md#unsubscribe) API 를 사용하여 구독중이던 영상을 구독 취소 할 수 있습니다.

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

## Step 6. 회의실 퇴장

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

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

## 목록 조회

### 참여자 목록 조회

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

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

### 방송 목록 조회

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

### 화면공유 정보 조회

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

## 비디오 장치 제어

### mute/unmute

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

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

### 입력 장치 변경

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

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

## 오디오 장치 제어

### mute/unmute

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

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

### 입력 장치 변경

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

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

## 룸 삭제

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.omnitalk.io/typescript/developers-guide/video-room.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
