自 1.4.1 版本起,你可以使用媒体流加速 SDK 提供的内部音频编解码器对音频进行编码操作。本文以使用 C API 将 PCM 数据编码为 Opus 格式为例,介绍如何使用 SDK 内部音频编码器发送和接收数据。
下图展示了使用 SDK 内置编解码器的操作步骤。
调用 agora_rtc_join_channel
方法加入 RTC 频道时,设置 rtc_channel_options_t.audio_codec_opt.audio_codec_type
为 Opus、G722、G711A 或 G711U 音频编码。根据不同的 codec 设置不同的采样率和声道数。详见 audio_codec_type_e。
// 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;
调用 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
。
如果你使用自己的编解码器,则需要调用 agora_rtc_join_channel
方法加入 RTC 频道时,设置 rtc_channel_options_t.audio_codec_opt.audio_codec_type
为 AUDIO_CODEC_DISABLED
。在调用agora_rtc_send_audio_data
方法发送音频数据时,将 *info_ptr.data_type
参数设置为你的编码格式。这个设置主要是为了信息同步,即接收端通过此设置可获知你发送的音频编码格式。SDK 不会对音频进行处理。
接收端通过 on_audio_data
回调获取发送端传输的编码音频数据和编码格式,并通过你自己的解码器进行解码。