Agora 默认的音频模块可以满足在 app 中使用基本音频功能的需求。Agora SDK 支持使用自定义音频渲染为你的 app 添加特殊的音频功能。
本文介绍如何将自定义音频渲染集成到你的 app 中。
实时音频传输过程中,Agora SDK 通常会开启默认的音频模块。然而,在以下场景中,你可能会需要自定义音频渲染。例如:
使用自定义音频渲染管理音频帧的处理和播放时,需要使用 Agora SDK 外部方法。
下图展示在自定义音频渲染时,音频数据的传输过程:
pullAudioFrame
获取远端用户发送的音频数据。在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现视频通话或实现视频直播。
本节介绍如何使用自定义音频渲染。
参考如下调用时序,在你的项目中调用自定义音频渲染 API 实现自定义音频渲染。
在 SDK 初始化过程中,禁止 SDK 使用音频设备。
RtcEngineContext context;
// 禁止 SDK 使用音频设备
context.enableAudioDevice = false;
int ret = m_rtcEngine->initialize(context);
调用 joinChannel
前,调用 setExternalAudioSink
开启和配置自定义音频渲染。
// 开启自定义音频渲染
// 采样率(Hz)可以设置为 16000,32000,441000 或者 48000
// 声道数可以设置为 1 或 2
nRet = m_rtcEngine->setExternalAudioSink(m_renderAudioInfo.sampleRate, m_renderAudioInfo.channels);
加入频道后,调用 pullAudioFrame
获取远端用户发送的音频数据。使用你自己的音频渲染器处理音频数据,然后播放已渲染的数据。
void CAgoraCaptureAduioDlg::PullAudioFrameThread(CAgoraCaptureAduioDlg * self)
{
int nRet = 0;
agora::util::AutoPtr<agora::media::IMediaEngine> mediaEngine;
mediaEngine.queryInterface(self->m_rtcEngine, AGORA_IID_MEDIA_ENGINE);
IAudioFrameObserver::AudioFrame audioFrame;
audioFrame.avsync_type = 0; // 预留参数
audioFrame.bytesPerSample = TWO_BYTES_PER_SAMPLE;
audioFrame.type = agora::media::IAudioFrameObserver::FRAME_TYPE_PCM16;
audioFrame.channels = self->m_renderAudioInfo.channels;
audioFrame.samplesPerChannel = self->m_renderAudioInfo.sampleRate / 100 * self->m_renderAudioInfo.channels;
audioFrame.samplesPerSec = self->m_renderAudioInfo.sampleRate;
audioFrame.buffer = new BYTE[audioFrame.samplesPerChannel * audioFrame.bytesPerSample];
while (self->m_extenalRenderAudio )
{
// 拉取远端音频数据
nRet = mediaEngine->pullAudioFrame(&audioFrame);
if (nRet != 0)
{
Sleep(10);
continue;
}
SIZE_T nSize = audioFrame.samplesPerChannel * audioFrame.bytesPerSample;
self->m_audioRender.Render((BYTE*)audioFrame.buffer, nSize);
}
delete audioFrame.buffer;
}
参考如下步骤,在你的项目中调用原始音频数据 API 实现自定义音频渲染:
onRecordAudioFrame
,onPlaybackAudioFrame
,onMixedAudioFrame
或者 onPlaybackAudioFrameBeforeMixing
获取待播放的音频数据。本节介绍本文中使用方法的更多信息以及相关页面的链接。
Agora 在 GitHub 上提供了一个开源的示例项目。你可以在 GitHub 上参考源代码或下载体验。