原始音频数据

功能描述

NERTC 的音频模块会严格控制声音设备的采集和播放逻辑,同时支持对采集到的音视频数据进行前处理和后处理,获取想要的播放效果。

NERTC SDK 通过提供 NERtcAudioFrameObserver 类,实现采集、修改原始音频数据功能。

Android

实现方法

在使用原始数据功能前,请确保你已在项目中完成基本的实时音视频功能。

参考如下步骤,在你的项目中实现原始音频数据功能:

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

示例代码

NERtcAudioFrameObserver observer = target == 0 ? null : new NERtcAudioFrameObserver() {
    @Override
    public void onRecordFrame(NERtcAudioFrame audioFrame) {
        if (target == 1 || target == 3) {
            NERtcAudioFormat format = audioFrame.getFormat();
            ByteBuffer buffer = audioFrame.getData();
            if (format != null && buffer != null) {
                buffer.rewind();
                int len = format.getChannels() * format.getBytesPerSample() * format.getSamplesPerChannel();
                soundTouchRecord.processBuffer(buffer,
                        len,
                        format.getBytesPerSample(),
                        format.getSampleRate(),
                        format.getChannels());
            }
        }
    }

    @Override
    public void onPlaybackFrame(NERtcAudioFrame audioFrame) {
        if (target == 2 || target == 3) {
            NERtcAudioFormat format = audioFrame.getFormat();
            ByteBuffer buffer = audioFrame.getData();
            if (format != null && buffer != null) {
                buffer.rewind();
                int len = format.getChannels() * format.getBytesPerSample() * format.getSamplesPerChannel();
                soundTouchPlayback.processBuffer(buffer,
                        len,
                        format.getBytesPerSample(),
                        format.getSampleRate(),
                        format.getChannels());
            }
        }
    }
};

NERtcEx.getInstance().setAudioFrameObserver(observer);

API参考

事件 事件描述
setRecordingAudioFrameParameters 设置录制的声音格式
setPlaybackAudioFrameParameters 设置录制的声音格式
setAudioFrameObserver 设置音频采集/播放PCM回调,用于声音处理等操作
方法 功能描述
onPlaybackFrame 音频播放PCM回调,用于声音处理等操作
onRecordFrame 音频采集PCM回调,用于声音处理等操作

开发注意事项

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

iOS

实现方法

在使用原始数据功能前,请确保你已在项目中完成基本的实时音视频功能。

参考如下步骤,在你的项目中实现原始音频数据功能:

  1. 加入频道前调用 setAudioFrameObserver 方法注册语音观测器,并在该方法中实现一个 NERtcEngineAudioFrameObserver 类;
  2. 成功注册后,SDK 通过 onNERtcEngineAudioFrameDidRecordonNERtcEngineAudioFrameWillPlayback 回调采集和接收到的原始音频数据;
  3. 用户拿到音频数据后,根据场景需要自行进行处理。完成音频数据处理后,可以直接进行自播放,或根据场景需求再通过 onNERtcEngineAudioFrameDidRecordonNERtcEngineAudioFrameWillPlayback 回调发送给 SDK。

示例代码

- (void)onNERtcEngineAudioFrameDidRecord:(NERtcAudioFrame *)frame {
    if (!frame) {
        return;
    }

    if (!_enableRecordAudioObserver) {
        return;
    }

    if (!_recordSoundTouch) {
        _recordSoundTouch = [[NTESSoundTouch alloc] initWithSampleRate:frame.format.sample_rate];
    }

    [_recordSoundTouch processSound:frame.data number:frame.format.samples_per_channel];
}

- (void)onNERtcEngineAudioFrameWillPlayback:(NERtcAudioFrame *)frame {
    if (!frame) {
        return;
    }

    if (!_enablePlaybackAudioObserver) {
        return;
    }

    if (!_playbackSoundTouch) {
        _playbackSoundTouch = [[NTESSoundTouch alloc] initWithSampleRate:frame.format.sample_rate];
    }

    [_playbackSoundTouch processSound:frame.data number:frame.format.samples_per_channel];
}


[self.coreEngine setAudioFrameObserver:self];

API参考

方法 功能描述
setRecordingAudioFrameParameters 设置录制的声音格式
setPlaybackAudioFrameParameters 设置播放的声音格式
setAudioFrameObserver 设置音频数据帧观测器
事件 事件描述
onNERtcEngineVideoFrameCaptured 本地视频数据采集回调
onNERtcEngineAudioFrameDidRecord 音频采集帧回调
onNERtcEngineAudioFrameWillPlayback 音频播放帧回调

开发注意事项

  1. 用户可以根据自身需求, 使用接口 setRecordingAudioFrameParameters, setPlaybackAudioFrameParameters 修改回调中的音频采样率;

Windows/macOS

实现方法

在使用原始数据功能前,请确保你已在项目中完成基本的实时音视频功能。

参考如下步骤,在你的项目中实现原始音频数据回调功能:

  1. 加入频道前基于 INERtcAudioFrameObserver 接口类实现一个 NERtcAudioFrameObserver 类,并调用 setAudioFrameObserver 方法注册语音观测器。
  2. 成功注册后,SDK 通过 onAudioFrameDidRecordonAudioFrameWillPlayback 回调采集和接收到的原始音频数据。
  3. 用户拿到音频数据后,根据场景需要自行进行处理。完成音频数据处理后,你可以直接进行自播放,或根据场景需求再通过 onAudioFrameDidRecordonAudioFrameWillPlayback 回调发送给 SDK。

示例代码

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

class NERtcAudioFrameObserver : public nertc::INERtcAudioFrameObserver

{
    ...
    virtual void onAudioFrameDidRecord(nertc::NERtcAudioFrame *frame) override;
    virtual void onAudioFrameWillPlayback(nertc::NERtcAudioFrame *frame) override;
    ...
}
void NERtcAudioFrameObserver::onAudioFrameDidRecord(NERtcAudioFrame *frame)
{
    if (true == rtc_parameter_.audio_filter_enabled)
    {
        tools::audio_filter_process(frame->data, 
            frame->format.channels, 
            frame->format.sample_rate, 
            frame->format.bytes_per_sample, 
            frame->format.samples_per_channel);
    }
}

void NERtcAudioFrameObserver::onAudioFrameWillPlayback(NERtcAudioFrame *frame)
{
    if (true == rtc_parameter_.audio_filter_enabled)
    {
        tools::audio_filter_process(frame->data,
            frame->format.channels,
            frame->format.sample_rate,
            frame->format.bytes_per_sample,
            frame->format.samples_per_channel);
    }
}

rtc_engine_->setAudioFrameObserver(audioFrameObserver);

API参考

方法 功能描述
setRecordingAudioFrameParameters 设置录制的声音格式
setPlaybackAudioFrameParameters 设置播放的声音格式
setAudioFrameObserver 设置音频数据帧观测器
事件 事件描述
onAudioFrameDidRecord 音频采集帧回调
onAudioFrameWillPlayback 音频播放帧回调

开发注意事项

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