原始音频数据

更新时间: 2024/03/15 17:25:05

NERTC SDK 的音频模块会严格控制声音设备的采集和播放逻辑,同时支持对采集到的音视频原始数据进行自定义的前处理和后处理,获取想要的播放效果。适用于非标设备接入、自定义音频效果、语音处理、语音识别等场景。

  • 前处理:在音频数据发送到编码器前获取原始的音频数据进行修改,主要针对本地麦克风采集到的音频数据或自定义外部音频流。
  • 后处理:即在音频数据发送给解码器后获取原始的音频数据进行修改,主要针对接收到的远端用户音频数据。

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

前提条件

在使用原始数据处理功能前,请确保您已在项目中实现基本的实时音视频功能。

注意事项

技术原理

rawdata.png

实现方法

API 调用时序

以实现修改采集音频的音频数据为例,API 调用时序如下图所示。

sequenceDiagram
    autonumber
    participant 应用层
    participant NERtcSDK

    
    应用层->>NERtcSDK: setAudioFrameObserver
    应用层->>NERtcSDK: setRecordingAudioFrameParameters
    NERtcSDK-->>应用层: onNERtcEngineAudioFrameDidRecord
    Note over 应用层, NERtcSDK: 自行处理音频数据
    NERtcSDK-->>应用层: onNERtcEngineAudioFrameDidRecord

配置步骤

  1. 加入房间前调用 setAudioFrameObserver 方法注册语音观测器,并在该方法中实现一个 NERtcEngineAudioFrameObserver 类。

  2. 设置回调的音频采样率。

  3. SDK 返回回调。

  4. 用户拿到音频数据后,需要根据场景自行进行处理。

  5. 完成音频数据处理后,您可以直接进行自播放,或根据场景需求再通过 onNERtcEngineAudioFrameDidRecordonNERtcEngineAudioFrameWillPlayback 回调发送给 SDK。

示例代码

objc//1. 注册语音观测器
 [[NERtcEngine sharedEngine] setAudioFrameObserver:self];

//2.设置回调的音频格式参数
  NERtcAudioFrameRequestFormat *format = [[NERtcAudioFrameRequestFormat alloc] init];
  format.channels = 1;
  format.sampleRate = 48000;
  format.mode = kNERtcAudioFrameOpModeReadWrite; //读写模式
  [[NERtcEngine sharedEngine] setRecordingAudioFrameParameters:format];

//3.在回调中处理数据
- (void)onNERtcEngineAudioFrameDidRecord:(NERtcAudioFrame *)frame {
    if (!frame) {
        return;
    }

    if (!_enableRecordAudioObserver) {
        return;
    }

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

    //若读写模式,SDK将会对处理后的音频数据发送,反之不会。
    [_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];
    }
  
    //若读写模式,SDK将会对处理后的音频数据发送,反之不会。
    [_playbackSoundTouch processSound:frame.data number:frame.format.samples_per_channel];
}

API 参考

方法 功能描述
setRecordingAudioFrameParameters 设置回调的采集音频采样率
setPlaybackAudioFrameParameters 设置回调的播放音频采样率
setMixedAudioFrameParameters 设置回调的混音音频采样率
setAudioFrameObserver 注册语音观测器
onNERtcEngineAudioFrameDidRecord 接收本端输入的采集音频数据回调
onNERtcEngineAudioFrameWillPlayback 接收本端输入的播放音频数据播放回调
onNERtcEngineMixedAudioFrame 接收采集与播放音频混合数据帧回调
onNERtcEnginePlaybackAudioFrameBeforeMixingWithUserID 接收远端播放的音频数据帧回调
此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 注意事项
  • 技术原理
  • 实现方法
  • API 调用时序
  • 配置步骤
  • 示例代码
  • API 参考