跳到主要内容

音频路由

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

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

本文主要描述了 SDK 在不同场景下的音频路由,默认音频路由修改方式,和音频路由监听方法。

初始化音频路由管理类

使用 SDK 提供的音频路由管理功能需首先进行初始化,其中 context 参数推荐使用 Application。

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

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

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

默认音频路由

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

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

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

更改默认音频路由

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

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

以下示例中默认音频路由被修改为听筒。

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

更改当前音频路由

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

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

以下示例中调用 enableSpeaker 方法,更改当前音频路由为扬声器。

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

在 App 用户接入外接音频输出设备后,SDK 会自动管理音频路由。具体行为如下:

  1. 音频路由自动切换到 App 用户连接的外部音频输出设备。
  2. 如果 App 用户先后连接了多个外部设备,则音频路由会自动切换到最后一个连接的音频输出设备。在同时连接有线耳机和连接蓝牙耳机的状态下,首次初始化或者重置音频路由状态会优先蓝牙输出。初始化完成之后会根据蓝牙和有线耳机的连接顺序进行选择,后连接者优先。
  3. 如果 App 用户移除当前输出设备,则音频路由会自动切换到上一个连接的音频输出设备。
  4. (SDK ≧ 5.3.2)如果 App 用户移除所有外接音频输出设备,SDK 切换到使用默认音频路由输出。

当移动设备连接到耳机或蓝牙音频设备时,无法将通过 enableSpeaker 更改为扬声器。

  • 如果 SDK 版本 < 5.3.2,SDK 会保留 enableSpeaker 设置的听筒和扬声器的输出状态,耳机断开之后会根据之前的状态选择听筒或者扬声器播放。
  • 如果 SDK 版本 ≧ 5.3.2,SDK 会在 App 用户移除所有外接音频输出设备后切换到使用默认音频路由输出。

在初始化 SDK 提供的音频路由管理类之后,不推荐 App 再调用系统的 AudioManager 修改音频输出通道,否则可能导致 SDK 内部的音频路由管理类状态错误。若必须使用,请在相关业务处理完成之后调用 resetAudioRouteState 方法重置音频路由管理类状态。

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

获取当前音频路由

对音频路由的任何更改都会触发 IRCRTCAudioRouteListener 中的 onRouteChanged 回调。您可以使用此回调来获取当前的音频路由。

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

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

}
});

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