音频路由
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 会使用默认音频路由。
加入房间前,调用 RCRTCEngine
下 setDefaultAudioRouteToSpeakerphone
可更改默认音频路由。通过该方法的 defaultToSpeaker
参数控制 SDK 是否使用扬声器播放音频。该接口在初始化音频路由前后都可以调用,但配置仅在音频路由管理类初始化完成后生效。
以下示例中默认音频路由被修改为听筒。
// 设置默认音频路由为设备内置听筒
RCRTCEngine.getInstance().setDefaultAudioRouteToSpeaker(false);
更改当前音频路由
在 App 用户未接入任何外接音频输出设备时,SDK 会使用默认音频路由的设置。如需更改当前音频路由,有两种方式:
- 直接修改 SDK 默认音频路由配置,您可以在通信过程中在扬声器、听筒之间动态切换。
- 调用 enableSpeaker 方法可以在通信过程中在扬声器、听筒之间动态切换。设置为
false
时 SDK 会恢复使用听筒。该方法在加入房间前后调用均可生效。enableSpeaker
只切换当前的音频路由为扬声器或听筒,不会影响 SDK 的默认音频路由设置。此时如果将外置设备连接再全部移除,SDK 会恢复为使用默认音频路由。
以下示例中调用 enableSpeaker
方法,更改当前音频路由为扬声器。
// 设置音频路由为扬声器
RCRTCEngine.getInstance().enableSpeaker(true);
在 App 用户接入外接音频输出设备后,SDK 会自动管理音频路由。具体行为如下:
- 音频路由自动切换到 App 用户连接的外部音频输出设备。
- 如果 App 用户先后连接了多个外部设备,则音频路由会自动切换到最后一个连接的音频输出设备。在同时连接有线耳机和连接蓝牙耳机的状态下,首次初始化或者重置音频路由状态会优先蓝牙输出。初始化完成之后会根据蓝牙和有线耳机的连接顺序进行选择,后连接者优先。
- 如果 App 用户移除当前输出设备,则音频路由会自动切换到上一个连接的音频输出设备。
- (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 | 蓝牙耳机 |