You need to enable JavaScript to run this app.
导航

获取原始音频数据

最近更新时间2024.03.13 15:27:32

首次发布时间2024.02.04 16:01:02

你可以获取格式为 PCM 的原始音频数据,对这些数据进行处理。例如,将数据存储到本地,实现客户端录制音频。

适用场景

  • 本地音频录制,应用将原始音频数据存储到本地设备中。

  • 客户端内容审核,获取声音数据并传入第三方 SDK,进行音频内容审核。

前提条件

你已经集成 RTC SDK,实现了基本的音视频通话。
支持获取原始音频数据的 SDK 详见API 及回调

功能实现

以下时序图以 Android SDK 中的 API 名称为例。不同端的 SDK 中 API 或回调名称可能略有不同,以 API 及回调为准。

alt

1. 创建引擎

创建和初始化一个音视频引擎类。

如果你需要获取远端的音频数据,还需要加入房间并发布音频流,参考 构建 RTC 应用 获取详细步骤。

rtcVideo = RTCVideo.createRTCVideo(this, Constants.APP_ID, videoEventHandler, null, null);

2. 继承 AudioFrameObserver

继承回调类,并实现里面的回调方法。

private IAudioFrameObserver audioFrameObserver = new IAudioFrameObserver() {
    @Override
    public void onRecordAudioFrame(IAudioFrame audioFrame) {
        Log.i(TAG, "onRecordAudioFrame:");
    }

    @Override
    public void onPlaybackAudioFrame(IAudioFrame audioFrame) {
        Log.i(TAG, "onPlaybackAudioFrame:");
    }

    @Override
    public void onRemoteUserAudioFrame(RemoteStreamKey streamKey, IAudioFrame audioFrame) {
        Log.i(TAG, "onRemoteUserAudioFrame:");
    }

    @Override
    public void onMixedAudioFrame(IAudioFrame audioFrame) {
        Log.i(TAG, "onMixedAudioFrame:");
    }
};

3. 开启回调

  1. 通过 registerAudioFrameObserver 注册音频数据回调。

  2. 调用 enableAudioFrameCallback,为需要收到的音频数据设置回调格式。每次调用只能设置其中一种音频数据的格式。

目标音频数据为录制、回放和混音时,需要在音频参数格式 format 中指定具体的采样率和声道数。
目标音频数据为远端音频流时,音频参数格式 format 需要设置为自动。

  1. RawAudioDataObserver 中接收对应类型的音频回调数据,你可以在回调数据中实现音频录制等操作。
// 注册音频数据回调
rtcVideo.registerAudioFrameObserver(audioFrameObserver);
//设置回调音频格式
AudioFormat format = new AudioFormat(AudioSampleRate.AUDIO_SAMPLE_RATE_48000, AudioChannel.AUDIO_CHANNEL_MONO);
// 开启本地麦克风录制的音频数据回调
rtcVideo.enableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_RECORD, format);
// 开启本地麦克风录制和订阅的远端所有用户混音后的音频数据回调
rtcVideo.enableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_MIXED, format);
// 开启订阅的远端所有用户混音后的音频数据回调
rtcVideo.enableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_PLAYBACK, format);

//设置回调音频格式
AudioFormat audioFormat = new AudioFormat(AudioSampleRate.AUDIO_SAMPLE_RATE_AUTO, AudioChannel.AUDIO_CHANNEL_AUTO);
// 开启订阅的远端每个用户混音前的音频数据回调
rtcVideo.enableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_REMOTE_USER, audioFormat);

4. 关闭回调

不再需要音频数据时,给 registerAudioFrameObserver 传空可关闭回调。

rtcVideo.disableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_RECORD);
rtcVideo.disableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_MIXED);
rtcVideo.disableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_PLAYBACK);
rtcVideo.disableAudioFrameCallback(AudioFrameCallbackMethod.AUDIO_FRAME_CALLBACK_REMOTE_USER);

5. 销毁引擎

通话结束后,销毁音视频引擎。

如果用户已经进入房间,则需要在销毁所有房间实例后再销毁音视频引擎。

RTCVideo.destroyRTCVideo();

示例项目

参考以下项目获取完整代码。

API 及回调

以下客户端 SDK 均支持获取原始音频数据。你可以根据上文中的描述和实例,使用不同的 SDK,在不同的端上实现这个功能。

说明:表格中的 macOS API 接口为 Objective-C,而示例项目中的 macOS 项目使用的是 Windows SDK 中的 API 接口。

平台AndroidiOSmacOSWindowsLinuxElectronUnity
注册音频数据回调观察者registerAudioFrameObserverregisterAudioFrameObserver:registerAudioFrameObserver:registerAudioFrameObserverregisterAudioFrameObserver
设置并开启指定的音频数据帧回调enableAudioFrameCallbackenableAudioFrameCallback:format:enableAudioFrameCallback:format:enableAudioFrameCallbackenableAudioFrameCallbackenableAudioFrameCallbackEnableAudioFrameCallback
关闭音频数据帧回调disableAudioFrameCallbackdisableAudioFrameCallback:disableAudioFrameCallback:disableAudioFrameCallbackdisableAudioFrameCallbackdisableAudioFrameCallbackDisableAudioFrameCallback

音频数据回调回调

IAudioFrameObserver

ByteRTCAudioFrameObserver

ByteRTCAudioFrameObserver

IAudioFrameObserver

IAudioFrameObserver

onRecordAudioFrame
onPlaybackAudioFrame
onRemoteUserAudioFrame
onMixedAudioFrame
onRecordScreenAudioFrame

OnRecordAudioFrameEventHandler
OnPlaybackAudioFrameEventHandler
OnRemoteUserAudioFrameEventHandler
OnMixedAudioFrameEventHandler
OnRecordScreenAudioFrameEventHandler

常见问题

Q1:调用开启接口成功,但收不到回调

A:确认调用 enableAudioFrameCallback 时传入的参数 methodformat 是否匹配,参考以下表格。

参数含义参数名称参数取值组合 1参数取值组合 2

音频回调方法

method

  • 0: 本地麦克风
  • 1: 所有远端混音
  • 2: 本地与远端混音

3: 单个远端用户音频流

音频格式format指定采样率和声道-1: 自动

Q2:如何将音频数据处理后发送到远端

A:通过本文提到的回调获取数据,进行处理后,不会影响发送到远端的数据。如果你希望处理音频数据后,送回 RTC 进行编码和发送,应使用 registerAudioProcessor 方法,参见 自定义音频处理