# 实现观众端多码率 (/zh-CN/realtime-media/transcoding/build/enable-multiple-bitrate)

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

## 工作原理 [#工作原理]

本文介绍观众端多码率的实现流程。

观众端多码率功能本质就是将主播的音视频流转码成多种画质档位的音视频流，不同环境和设备的观众按需订阅不同档位的音视频流。

你需要通过多码率 RESTful API 设置转码后音视频流的视频分辨率和帧率，声网服务器会根据分辨率、帧率、网络环境等因素自动设置合适的视频码率。你设置的转码视频属性又称为转码模板。

通过多码率 RESTful API 发起请求时，你需要设置转码模板 ID，用于代表转码后的音视频流所位于的频道。假设频道名为 `channel` 的频道开启观众端多码率功能，转码模板 ID 为 `codecId`，那么观众只需进入频道名为 `channel_codecId` 的频道即可接收到转码后的主播音视频流。

<DocsImage alt="观众端多码率工作原理" src="https://web-cdn.agora.io/docs-portal/img/cloud-transcoder/multiple-bitrate.png" displayWidth="90%" />

声网遵循按需转码的原则，因此观众端多码率功能开启和停止转码的时间点如下：

- 开始转码：第一位观众加入转码频道后，声网开始对原频道的所有主播流进行转码。
- 停止转码：不同情况下停止转码的时间点有所不同：
  - 原频道中，某个主播退出频道超过 1 分钟时，声网停止对该主播的流进行转码。即，所有转码频道中停止对该主播的流进行转码。
  - 转码频道中，超过 1 分钟没有观众时，声网停止该转码频道内对所有主播流的转码。

## 实现流程 [#实现流程]

本节介绍实现观众端多码率功能和切换观众端码率的流程：

### 1. 实现多码率 [#1-实现多码率]

参考如下步骤实现观众端多码率：

1. 实现[基础的音视频互动](/zh-CN/realtime-media/rtc/get-started/quick-start)。为方便理解，假设进行音视频互动的主播都位于频道名为 `channel` 的频道。
2. 调用多码率 RESTful API 创建转码模板。例如，设置转码输出的音视频流为 360P，转码模板 ID 为 `360p`。
3. 观众端加入含有转码后主播流的频道。按照示例的设置，转码频道名为 `channel_360p`。

### 2. 切换多码率 [#2-切换多码率]

参考如下步骤切换观众端码率：

1. 实现观众端多码率后，调用多码率 RESTful API 更新转码模板。例如，设置转码输出的音视频流为 720P，转码模板 ID 为 `720p`。
2. 观众退出当前转码档位的频道。例如，上文中的 `channel_360p` 频道。
3. 观众加入新的转码档位的频道。按照示例的设置，新的转码频道的名称为 `channel_720p`。

## 开发注意事项 [#开发注意事项]

本节介绍开发注意事项：

- 观众端多码率功能仅对直播场景生效。只有当发流的用户在直播场景的频道中，才能进行转码。
- 为保证频道名的唯一性，请不要使用与转码频道重名的频道名。例如，根据[1. 实现多码率](/zh-CN/realtime-media/transcoding/build/enable-multiple-bitrate)中的设置，`channel_360p` 和 `channel_720p` 成为了转码频道名，因此你不能再用这个名称作为后续创建的频道的名称。
- 转码频道内主播的用户 ID 与原频道中的用户 ID 一致。为保证频道内用户 ID 的唯一性，原频道的主播不能同时以观众的身份加入转码频道。
- 声网建议你在业务层添加逻辑，引导观众选择加入真实存在的转码频道，以免观众加入不存在的转码频道。

## 术语说明 [#术语说明]

观众端多码率文档中用到如下术语：

- **原频道**：原始频道，不含有转码后的音视频流的频道。
- **转码频道**：包含转码后音视频流的频道。观众端多码率功能会将原频道主播的音视频流进行转码处理。转码处理后的音视频流会发布在转码频道中。在转码频道里，主播的用户 ID 和原频道中的用户 ID 一致。观众需要加入转码频道才能接收转码后的主播音视频流。
- **转码模板**：你为转码行为设置的模板，用于描述转码后的音视频流的视频分辨率和帧率。码率会由声网服务器根据转码模板和网络环境等因素自动设置。
