You need to enable JavaScript to run this app.
导航
Native 端自定义音频采集和渲染
最近更新时间:2025.11.10 15:11:16首次发布时间:2022.01.11 11:55:52
复制全文
我的收藏
有用
有用
无用
无用

RTC SDK 默认使用内置模块进行音频采集和渲染。在特定场景下,内置模块可能无法满足你的需求,比如:

  • 复用音视频应用中已有音频采集和渲染模块。
  • 对采集到的音视频数据进行一些传输前处理(美声、音效、AI 降噪等)。
  • 解决音频采集设备被占用问题。

在这些场景下,你可以参考本文,使用自定义方式进行音频的采集和渲染。

前提条件

开始自定义采集和渲染前,请确保你已经集成 v3.40 及以上版本的 RTC SDK,并实现基本的音频通话功能。

集成步骤

以 Android 为例,你可以参照以下步骤,实现自定义音频采集和渲染。

自定义音频采集

  1. 调用 setAudioSourceType 设置音频采集模式为自定义采集。

    // mRTCVideo 是你的 RTCVideo 实例
    mRTCVideo.setAudioSourceType(AudioSourceType.AUDIO_SOURCE_TYPE_EXTERNAL);
    
  2. 自行采集并处理音频数据。

  3. 每隔 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);    
    

自定义音频渲染

  1. 调用 setAudioRenderType 设置音频渲染方式为自定义渲染。

    mRTCVideo.setAudioRenderType(AudioRenderType.AUDIO_RENDER_TYPE_EXTERNAL);
    
  2. 进入房间后,每隔 10ms 调用 pullExternalAudioFrame 拉取远端用户的音频数据。
    核心逻辑示例

    // audioFrame 是一个预先创建的 AudioFrame 对象,用于接收数据
    if (mRTCVideo != null) {
        mRTCVideo.pullExternalAudioFrame(audioFrame);
        // 在此处添加你的音频播放/渲染逻辑
    }
    
  3. 在本地渲染拉取的音频数据。

注意事项

  1. 采用自定义音频采集和渲染时,请自行实现音频 3A(回声消除 AEC、自动增益控制 AGC、噪声抑制 ANS)处理。

  2. 如果需要从自定义采集切换回内部采集,需要先停止自定义采集任务,再调用 setAudioSourceType 并手动开启内部采集。

    // 1. 停止你的定时推送任务
    // yourCustomCaptureTimer.stop();
    
    // 2. 切换回内部采集
    mRTCVideo.setAudioSourceType(AudioSourceType.AUDIO_SOURCE_TYPE_INTERNAL);
    mRTCVideo.startAudioCapture(); // 手动开启内部采集
    

API 参考

平台自定义采集自定义渲染推送数据拉取数据
AndroidsetAudioSourceTypesetAudioRenderTypepushExternalAudioFramepullExternalAudioFrame
iOSsetAudioSourceType:setAudioRenderType:pushExternalAudioFrame:pullExternalAudioFrame:
WindowssetAudioSourceTypesetAudioRenderTypepushExternalAudioFramepullExternalAudioFrame
LinuxsetAudioSourceTypesetAudioRenderTypepushExternalAudioFramepullExternalAudioFrame