# 使用音频编解码器 (/zh-CN/realtime-media/rtsa/build/media-transmission/audio-codec)

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

自 1.4.1 版本起，SDK 支持使用以下两种音频编解码器：

- SDK 内置编解码器
- 用户自己的编解码器

两种方式的设置不同，详见下图：

![音频编解码流程图](https://web-cdn.agora.io/docs-files/1658200078128)

本文以使用 C API 将 PCM 数据编码为 Opus 格式为例，介绍如何使用音频编码器发送和接收数据。

## 使用 SDK 内置编解码器 [#使用-sdk-内置编解码器]

### 发送音频数据 [#发送音频数据]

参考以下步骤实现发送音频数据：

1. 调用 `agora_rtc_join_channel` 方法加入 RTC 频道，设置 `rtc_channel_options_t.audio_codec_opt.audio_codec_type` 为 Opus、G722、G711A 或 G711U 音频编码。根据不同的 codec 设置不同的采样率和声道数。详见 [`audio_codec_type_e`](/zh-CN/api-reference/rtsa/c/agora-rtc-api-8h#a307c5bae03eb9a318e247a97e6fb5d88)。

   ```c
   // 以 Opus 为例
   rtc_channel_options_t channel_options = { 0 };
   channel_options.audio_codec_opt.audio_codec_type = AUDIO_CODEC_TYPE_OPUS;
   channel_options.audio_codec_opt.pcm_sample_rate = 16000;
   channel_options.audio_codec_opt.pcm_channel_num = 1;
   ```

2. 调用 `agora_rtc_send_audio_data` 方法发送音频数据，将 `*info_ptr.data_type` 参数设置为 `AUDIO_DATA_TYPE_PCM`，即 PCM 类型。SDK 会自动将 PCM 数据编码为 Opus 格式并传输。

   ```c
   audio_frame_info_t info = { 0 };
   info.data_type = AUDIO_DATA_TYPE_PCM;

   int rval = agora_rtc_send_audio_data(g_conn_id, data, len, &info);
   if (rval < 0) {
     printf("Failed to send audio data, reason: %s\n", agora_rtc_err_2_str(rval));
     return -1;
   }
   ```

### 接收音频数据 [#接收音频数据]

SDK 会自动对音频数据进行解码。你可以通过 `on_audio_data` 回调获取发送端传输的 PCM 音频数据。`on_audio_data` 回调的 `*info_ptr.data_type` 参数为 `AUDIO_DATA_TYPE_PCM`。

## 使用自己的编解码器 [#使用自己的编解码器]

### 发送音频数据 [#发送音频数据-1]

参考以下步骤实现发送音频数据：

1. 调用 `agora_rtc_join_channel` 方法加入 RTC 频道，设置 `rtc_channel_options_t.audio_codec_opt.audio_codec_type` 为 `AUDIO_CODEC_DISABLED`。
2. 调用 `agora_rtc_send_audio_data` 方法发送音频数据，将 `*info_ptr.data_type` 参数设置为你的编码格式。该设置主要是为了信息同步，即接收端通过该设置可获取你发送音频数据的编码格式。SDK 不会对音频数据进行编码处理，你需要通过自己的编码器进行编码。

### 接收音频数据 [#接收音频数据-1]

接收端通过 `on_audio_data` 回调获取发送端传输的已编码音频数据和编码格式，并通过你自己的解码器进行解码。
