功能描述
音视频 SDK 提供了获取 原始音频数据 功能来实现对音频的编码前处理和解码后处理,即在音视频处理过程中,对采集和接收到的音频帧进行修改,实现特殊的播放效果。
编码前处理:在编码前对SDK提供的原始音频数据(例如,本地麦克风采集的音频数据)进行处理。 解码后处理:在解码后对SDK提供的原始音频数据(例如,接收到的远端用户音频数据)进行处理。
Native SDK 通过提供 IAudioFrameObserver 类,实现获取或者修改原始音频数据功能。
实现方法
操作步骤
获取原始音频数据前,请确保已实现基本的音视频功能。
- 加入频道前调用 registerAudioFrameObserver方法注册语音观测器,并在该方法中实现一个IAudioFrameObserver类。
- 成功注册后,SDK 通过 onRecordAudioFrame、onPlaybackAudioFrame、onPlaybackAudioFrameBeforeMixing或onMixedAudioFrame回调发送采集到的原始音频数据。
- 用户拿到音频数据后,根据场景需要自行进行处理。完成音频数据处理后,你可以直接进行自播放,或根据场景需求再通过 onRecordAudioFrame、onPlaybackAudioFrame、onPlaybackAudioFrameBeforeMixing或onMixedAudioFrame回调发送给 SDK。
- (可选)调用 registerAudioFrameObserver并传入NULL取消注册。
API 时序图
下图展示使用原始音频数据的 API 调用时序:

通过回调获得AudioFrame对象,对该对象做修改并返回给 SDK。
示例代码
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 参考
如果想要修改上述回调中的音频采样率,可以根据场景需求,调用如下方法进行设置:

