RTC SDK 默认使用内置模块进行音频采集和渲染。在特定场景下,内置模块可能无法满足你的需求,比如:
在这些场景下,你可以参考本文,使用自定义方式进行音频的采集和渲染。
开始自定义采集和渲染前,请确保你已经集成 v3.40 及以上版本的 RTC SDK,并实现基本的音频通话功能。
以 Android 为例,你可以参照以下步骤,实现自定义音频采集和渲染。
调用 setAudioSourceType 设置音频采集模式为自定义采集。
// mRTCVideo 是你的 RTCVideo 实例 mRTCVideo.setAudioSourceType(AudioSourceType.AUDIO_SOURCE_TYPE_EXTERNAL);
自行采集并处理音频数据。
每隔 10ms 调用 pushExternalAudioFrame 将处理好的音频数据推送到 RTC SDK。
核心逻辑示例:
// 每10ms的数据大小 int size = 16 * 10; if (isFirstPush) { // 建议第一次时传入200ms的缓冲数据,避免噪音 size = size * 20; isFirstPush = false; } ByteBuffer pushBuffer = ByteBuffer.allocate(size * 2); AudioFrame audioFrame = new AudioFrame(); audioFrame.channel = AudioChannel.AUDIO_CHANNEL_MONO; audioFrame.sampleRate = AudioSampleRate.AUDIO_SAMPLE_RATE_16000; audioFrame.samples = size; int nRead = 0; //伪代码,以客户采集方式为准,但必须遵守每10ms调用一次,一次push 10ms的音频数据 if (fileData != null) { nRead = Integer.min(size * 2, fileDataBufferSize - fileDataOffset); pushBuffer.put(fileData, fileDataOffset, nRead); fileDataOffset += nRead; } Log.i(TAG, "offset:" + fileDataOffset + " read:" + nRead); if (nRead == 0) { fileDataOffset = 0; } audioFrame.buffer = pushBuffer.array(); rtcVideo.pushExternalAudioFrame(audioFrame);
调用 setAudioRenderType 设置音频渲染方式为自定义渲染。
mRTCVideo.setAudioRenderType(AudioRenderType.AUDIO_RENDER_TYPE_EXTERNAL);
进入房间后,每隔 10ms 调用 pullExternalAudioFrame 拉取远端用户的音频数据。
核心逻辑示例:
// audioFrame 是一个预先创建的 AudioFrame 对象,用于接收数据 if (mRTCVideo != null) { mRTCVideo.pullExternalAudioFrame(audioFrame); // 在此处添加你的音频播放/渲染逻辑 }
在本地渲染拉取的音频数据。
采用自定义音频采集和渲染时,请自行实现音频 3A(回声消除 AEC、自动增益控制 AGC、噪声抑制 ANS)处理。
如果需要从自定义采集切换回内部采集,需要先停止自定义采集任务,再调用 setAudioSourceType 并手动开启内部采集。
// 1. 停止你的定时推送任务 // yourCustomCaptureTimer.stop(); // 2. 切换回内部采集 mRTCVideo.setAudioSourceType(AudioSourceType.AUDIO_SOURCE_TYPE_INTERNAL); mRTCVideo.startAudioCapture(); // 手动开启内部采集