跳到主要内容

音频路由

SDK 提供音频路由功能,用于管理 App 播放音频时的输出设备。主要功能如下:

  • 设置默认音频路由(SDK ≥ 5.3.2)。在无外接设备时,使用默认的音频输出设备(无外接设备,设备内置的听筒或扬声器)。一旦接入外部设备,SDK 仅使用外接设备。
  • 在接入有线耳机、蓝牙耳机、蓝牙音响等外部设备时,自动根据设备连接顺序与可用状态切换当前输出设备。当有多个外接设备时,音频会通过最后一个接入的设备播放。

本文介绍 SDK 在不同场景下的音频路由、默认音频路由的修改方式,以及音频路由监听方法。

初始化音频路由管理类

使用 SDK 提供的音频路由管理功能需要先进行初始化。context 参数建议传入 Application 上下文。

Java
// 初始化音频路由管理类
RCRTCAudioRouteManager.getInstance().init(context);

若要停止使用自动音频路由功能,可进行反初始化:

Java
// 反初始化音频路由管理类
RCRTCAudioRouteManager.getInstance().unInit();

默认音频路由

默认音频路由是指App 所在设备的默认音频输出设备,例如移动设备上的听筒或扬声器。

在不同的 音频模式 下,SDK 使用的默认音频路由如下:

  • 音视频通话、会议(AudioScenario.DEFAULT):听筒
  • 语聊房、音乐播放场景(AudioScenario.MUSIC_CHATROOM):扬声器
  • 音乐教学场景(AudioScenario.MUSIC_CLASSROOM):扬声器

更改默认音频路由

当用户未连接外部音频输出设备时,SDK 使用默认音频路由。

加入房间前,可调用 RCRTCEnginesetDefaultAudioRouteToSpeaker 更改默认音频路由。通过参数 defaultToSpeaker 控制是否默认使用扬声器播放音频。该接口在音频路由管理类初始化前后均可调用,但配置仅在音频路由管理类初始化完成后生效。

以下示例将默认音频路由修改为听筒:

Java
// 设置默认音频路由为设备内置听筒
RCRTCEngine.getInstance().setDefaultAudioRouteToSpeaker(false);

更改当前音频路由

在用户未接入任何外接音频输出设备时,SDK 按默认音频路由播放。如需更改当前音频路由,有两种方式:

  • 修改默认音频路由配置,可在通信过程中在扬声器与听筒之间切换。
  • 调用 enableSpeaker 在通信过程中动态切换扬声器/听筒。设置为 false 时恢复为听筒。该方法在加入房间前后均可生效;enableSpeaker 只切换当前的音频路由为扬声器或听筒,不会影响 SDK 的默认音频 路由设置。此时如果将外置设备连接再全部移除,SDK 会恢复为使用默认音频路由。

以下示例通过 enableSpeaker 更改当前音频路由为扬声器:

Java
// 设置音频路由为扬声器
RCRTCEngine.getInstance().enableSpeaker(true);

当用户接入外接音频输出设备后,SDK 会自动管理音频路由:

  1. 音频路由自动切换到App 用户当前连接的外部音频输出设备。
  2. 若先后连接多个外部设备,则自动切换到最后一个连接的音频输出设备。在同时连接有线耳机与蓝牙耳机的情况下,首次初始化或重置音频路由状态会优先蓝牙输出;初始化完成后将按连接顺序选择,后连接者优先。
  3. 若移除当前输出设备,音频路由会自动切换到上一个连接的音频输出设备。 1.(SDK ≥ 5.3.2)若移除所有外接音频输出设备,SDK 切换为使用默认音频路由输出。
提示

当设备连接到耳机或蓝牙音频设备时,无法通过 enableSpeaker 强制切换为扬声器。

  • 若 SDK 版本 < 5.3.2,SDK 会保留 enableSpeaker 设置的听筒/扬声器状态;耳机断开后将按之前状态选择听筒或扬声器播放。
  • 若 SDK 版本 ≥ 5.3.2,SDK 会在移除所有外接音频输出设备后切换为使用默认音频路由输出。

在初始化音频路由管理类之后,不建议再直接调用系统 AudioManager 修改音频输出通道,否则可能导致 SDK 内部的音频路由管理类状态异常。若必须使用,请在相关业务处理完成后调用 resetAudioRouteState 重置状态。

Java
// 重置音频路由管理类状态
RCRTCAudioRouteManager.getInstance().resetAudioRouteState();

获取当前音频路由

对音频路由的任何更改都会触发 IRCRTCAudioRouteListeneronRouteChanged 回调。您可以通过该回调获知当前音频路由。

App 可通过 setOnAudioRouteChangedListener 设置监听;使用完成后请及时将 listener 设置为 null,避免内存泄漏。

Java
// 设置音频输出设备改变监听
RCRTCAudioRouteManager.getInstance().setOnAudioRouteChangedListener(new IRCRTCAudioRouteListener() {
@Override
public void onRouteChanged(RCAudioRouteType type) {

}
});

// 使用完成后,请及时设置为 null,避免内存泄漏
RCRTCAudioRouteManager.getInstance().setOnAudioRouteChangedListener(null);
RCAudioRouteType 类型说明
SPEAKER_PHONE扬声器
EARPIECE听筒
HEADSET有线耳机
HEADSET_BLUETOOTH蓝牙耳机