# 加入和离开频道 (/zh-CN/realtime-media/rtc/build/initialize-and-channel/join-leave-channel)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

声网 Web SDK 使用 AgoraRTCClient 对象来管理一个本地用户在目标频道内的行为。

在加入目标频道之前，你需要先创建一个 `AgoraRTCClient` 对象。

## 创建 AgoraRTCClient 对象 [#创建-agorartcclient-对象]

调用 [`AgoraRTC.createClient`](/zh-CN/api-reference/rtc/web/interfaces/iagorartc#createclient) 即可创建 `AgoraRTCClient` 对象。在创建 `AgoraRTCClient` 时，你需要指定使用的编码格式 (`codec`) 以及频道场景 (`mode`)。

```javascript
const client = AgoraRTC.createClient({
  codec: "vp8",
  mode: "rtc",
});
```

### 选择视频编码格式 [#选择视频编码格式]

`codec` 设置支持 `"vp8"` (VP8)、`"h264"` (H.264)、`"vp9"` (VP9) 视频编码格式。该设置只会影响发布端的视频编码格式，对于订阅端来说只要其支持该格式的解码，都能正常完成订阅。

举例来说，桌面端 Chrome 58 及以上版本既支持 VP8 也支持 H.264，而 Safari 12.1 以下版本不支持 VP8 编解码；如果频道中有两个主播分别发布了 VP8 和 H.264 的视频流，使用桌面端 Chrome 58 的观众可以解码这两个主播的视频，使用 Safari 12.1 以下版本浏览器的观众只能解码 H.264 的视频流。

不同浏览器和不同设备对这三种编解码格式的支持情况不同。下表列出不同浏览器所支持的编解码格式，供你参考：

|浏览器|VP8|H.264|VP9|
|---|---|---|---|
|桌面端 Chrome 58+|✔|✔|✔|
|Firefox 56+|✔|✔ 1|✔（需要 Firefox 69+）|
|Safari 12.1+|✔|✔|✔（需要 Safari 16+）|
|Safari < 12.1|✘|✔|✘|
|Android Chrome 58+|✔|无明确信息2|✔（需要 Chrome 68+）|

:::info[信息]
- 1Firefox 对 H.264 的支持依赖 **OpenH264 Video Codec provided by Cisco Systems, Inc.** 插件。Firefox 安装成功后会自动在后台下载该插件并默认启用，但是如果通话时插件没有下载完成，Firefox 就无法支持 H.264。
- 2Android 设备上 Chrome 58 及以后版本对 H.264 的支持取决于设备。因为 Chrome 在 Android 设备上对 H.264 强制使用硬件编解码，即使 Chrome 支持 H.264，如果 Android 设备的芯片不支持 H.264 的硬件编解码，H.264 实际上也是不可用的。
:::

### 选择频道场景 [#选择频道场景]

频道场景 (`mode`) 是声网为了对不同的实时音视频场景进行针对性算法优化而提供的一种设置选项。SDK 支持两种频道场景：`"rtc"`（通信场景）和 `"live"`（直播场景）。

**通信场景**

`"rtc"`（通信场景）适用于频道内所有用户需要相互交流且用户总数不太多的场景，如多人会议和在线聊天。

**直播场景**

`"live"`（直播场景）适用于发布端很少但是订阅端很多的场景，这种场景下 SDK 定义了两种用户角色：观众（默认）和主播。主播能够发送和接收音视频，观众不能发送、只能接收音视频。你可以通过设置 `createClient` 的 [`role`](/zh-CN/api-reference/rtc/web/interfaces/clientconfig#role) 参数来指定用户角色，也可以调用 [`setClientRole`](/zh-CN/api-reference/rtc/web/interfaces/iagorartcclient#setclientrole) 来动态修改用户角色。

## 加入频道 [#加入频道]

创建 `AgoraRTCClient` 对象后，就可以调用 [`AgoraRTCClient.join`](/zh-CN/api-reference/rtc/web/interfaces/iagorartcclient#join) 加入频道。你需要注意：

- 该方法为异步方法，使用时需要配合 `Promise` 或 `async/await`。
- 设置 `join` 方法的第四个参数 `uid` 时，如果不传入任何值，声网会为这个加入的本地用户自动分配一个 Number 型的用户 ID 作为其唯一的身份标识。你也可以通过该参数自行指定一个 Number 型的用户 ID。

    :::info[信息]
    请确保频道内用户 ID 的唯一性。声网建议你在业务层面避免用户使用相同的 ID 加入一个频道。
    :::

```javascript
// 自动分配数字 UID
const uid = await client.join("APPID", "CHANNEL", "TOKEN");

// 指定数字 UID
await client.join("APPID", "CHANNEL", "TOKEN", 393939);
```

## 离开频道 [#离开频道]

调用 [`AgoraRTCClient.leave`](/zh-CN/api-reference/rtc/web/interfaces/iagorartcclient#leave) 可以离开当前频道。该方法可以在任何时候调用，包括正在加入频道时或者正在重连时。该方法为异步方法，使用时需要配合 `Promise` 或 `async/await`。

调用 `leave` 后，SDK 会立刻销毁与当前频道相关的对象，包括订阅的远端用户对象、远端轨道对象、记录连接状态的对象等。如果需要再次加入频道，在调用 `leave` 后再调用 `join` 即可。

```javascript
await client.leave();
```

## 参考信息 [#参考信息]

### 错误处理 [#错误处理]

在加入频道的过程中，因为 SDK 使用不当或者网络异常等原因，可能会抛出以下错误：

- `INVALID_PARAMS`: 提供的参数错误，比如提供了格式非法的 Token。
- `INVALID_OPERATION`: 非法操作。该错误通常是重复加入频道引起的，请确保重复加入时先调用 `leave`。
- `OPERATION_ABORTED`: 加入被中止，表示在 `join` 方法成功之前就调用了 `leave` 方法。
- `UNEXPECTED_RESPONSE`: 声网服务器返回了非预期的响应，通常是因为 App ID 或 Token 鉴权失败，例如开启了 App 证书却未传入 Token。
- `UID_CONFLICT`: 创建了多个 `AgoraRTCClient` 对象，且重复使用了同一个用户 ID。

<a id="connection"></a>
### 频道内的连接状态 [#频道内的连接状态]

详见[频道连接状态管理](/zh-CN/realtime-media/rtc/build/initialize-and-channel/channel-connection)。
