原始音频数据

最近更新时间:2022-09-20 05:17:40

功能描述

音视频 SDK 提供了获取 原始音频数据 功能来实现对音频的编码前处理解码后处理,即在音视频处理过程中,对采集和接收到的音频帧进行修改,实现特殊的播放效果。

编码前处理:在编码前对SDK提供的原始音频数据(例如,本地麦克风采集的音频数据)进行处理。 解码后处理:在解码后对SDK提供的原始音频数据(例如,接收到的远端用户音频数据)进行处理。

Native SDK 通过提供 IAudioFrameObserver 类,实现获取或者修改原始音频数据功能。

实现方法

操作步骤

获取原始音频数据前,请确保已实现基本的音视频功能。

  1. 加入频道前调用 registerAudioFrameObserver 方法注册语音观测器,并在该方法中实现一个 IAudioFrameObserver 类。
  2. 成功注册后,SDK 通过 onRecordAudioFrameonPlaybackAudioFrameonPlaybackAudioFrameBeforeMixingonMixedAudioFrame 回调发送采集到的原始音频数据。
  3. 用户拿到音频数据后,根据场景需要自行进行处理。完成音频数据处理后,你可以直接进行自播放,或根据场景需求再通过 onRecordAudioFrameonPlaybackAudioFrameonPlaybackAudioFrameBeforeMixingonMixedAudioFrame 回调发送给 SDK。
  4. (可选)调用 registerAudioFrameObserver 并传入 NULL 取消注册。

API 时序图

下图展示使用原始音频数据的 API 调用时序:

通过回调获得AudioFrame对象,对该对象做修改并返回给 SDK。

示例代码

你可以对照 API 时序图,参考下面的示例代码片段,在项目中实现音频原始数据功能:

class ArAudioFrameObserver : public ar::media::IAudioFrameObserver
{
  public:
      // 获取录制的音频帧
      virtual bool onRecordAudioFrame(AudioFrame& audioFrame) override
      {
          return true;
      }
      // 获取播放的音频帧
      virtual bool onPlaybackAudioFrame(AudioFrame& audioFrame) override
      {
          return true;
       }
      // 获取远端某个用户发送的音频帧
      virtual bool onPlaybackAudioFrameBeforeMixing(unsigned int uid, AudioFrame& audioFrame) override
       {
          return true;
       }
      // 获取本地录制和播放混音后的音频帧
      virtual bool onMixedAudioFrame(AudioFrame& audioFrame) override
       {
       return true;
       }

};

class IAudioFrameObserver
{
  public:
          enum AUDIO_FRAME_TYPE {
          FRAME_TYPE_PCM16 = 0, // 音频数据格式为 PCM 16
          };
  struct AudioFrame {
          AUDIO_FRAME_TYPE type;
          int samples;  // 该音频帧的帧数
          int bytesPerSample; // 每帧的字节数:2
          int channels; // 声道数;双声道则音频数据重叠
          int samplesPerSec; // 采样率
          void* buffer; // 音频数据 Buffer
          int64_t renderTimeMs; // 当前音频帧的时间戳
       };
  public:
          virtual bool onRecordAudioFrame(AudioFrame& audioFrame) = 0;
          virtual bool onPlaybackAudioFrame(AudioFrame& audioFrame) = 0;
          virtual bool onPlaybackAudioFrameBeforeMixing(unsigned int uid, AudioFrame& audioFrame) = 0;
          virtual bool onMixedAudioFrame(AudioFrame& audioFrame) = 0;
};

API 参考

  • onRecordAudioFrame
  • onPlaybackAudioFrame
  • onPlaybackAudioFrameBeforeMixing
  • onMixedAudioFrame

如果想要修改上述回调中的音频采样率,可以根据场景需求,调用如下方法进行设置:

  • setRecordingAudioFrameParameters
  • setPlaybackAudioFrameParameters
  • setMixedAudioFrameParameters

开发注意事项

  1. 本文中使用的原始数据接口为 C++ 接口。如果你在 iOS 或 macOS 平台开发,请参考如下步骤注册音频数据观测器。
static ARAudioFrameObserver* s_audioFrameObserver;
- (void)addRegiset:(ARRtcEngineKit *)rtcKit {

    // rtc Engine of C++
    AR::rtc::IRtcEngine* rtc_engine = (AR::rtc::IRtcEngine*)rtcKit.getNativeHandle;
    AR::util::AutoPtr<rtc::media::IMediaEngine> mediaEngine;
    mediaEngine.queryInterface(rtc_engine, rtc::AR_IID_MEDIA_ENGINE);

    if (mediaEngine) {
        s_audioFrameObserver = new ARAudioFrameObserver();
        mediaEngine->registerAudioFrameObserver(s_audioFrameObserver);
    }
}

- (void)cancelRegiset {
    AR::rtc::IRtcEngine* rtc_engine = (AR::rtc::IRtcEngine*)self.rtcKit.getNativeHandle;
    AR::util::AutoPtr<AR::media::IMediaEngine> mediaEngine;
    mediaEngine.queryInterface(rtc_engine, AR::AR_IID_MEDIA_ENGINE);
    mediaEngine->registerAudioFrameObserver(NULL);
}