【典型问题】音频路由问题

此贴总结了一些常见的音频路由问题,欢迎各位开发者们在本帖中讨论和补充。

观众上麦后,语音路由从扬声器变为听筒

问题具体现象:直播模式,单主播场景下,调用了 SetDefaultAudioRouteToSpeakerPhone(true) 设置语音路由为扬声器,此时观众听主播的声音是正常从扬声器出来的。但是观众上麦后,主播和连麦观众听到彼此的声音都很小,调试发现音频路由变成了听筒,声音从听筒出来了。

原因分析:一般是因为用户未添加相关权限导致的,需要添加权限:

android.permission.MODIFY_AUDIO_SETTINGS

为什么蓝牙连不上?或者连上了没有走到蓝牙?

Android

有些蓝牙音箱只支持 A2DP, 如果不支持 SCO 的话,那么是无法用来进行 SDK 通话的。App 开发者可以通过 Android API AudioManmager.isBluetoothScoAvailableOffCall() 判断该机型是否支持 btsco,如果机型不支持,则 audio route 蓝牙切换会失败。

iOS

iOS 系统会自动为系统电话和 VoIP 通话选择音频路由,即使蓝牙设备已经连接,也不一定会走蓝牙:

系统电话(包括CallKit)

如果系统来电的时候,用户是在 iPhone 设备上按了接听键:来电默认走 iPhone 听筒;如果系统来电的时候,用户是在蓝牙设备上按了接听键:来电默认走蓝牙。

系统的默认行为可以设置,在 iPhone 的 “设置-通用-辅助功能-音频通话方式”,上述行为是默认的“自动”。如果设为“蓝牙耳机”,则来电的时候即使在手机接听,也默认走蓝牙耳机。

在系统电话过程中,用户可以通过通话界面的外放按钮自行切换 蓝牙/听筒/外放;

VoIP通话

在发起 VoIP 通话的时候,系统会自动选择音频路由为当前蓝牙设备连接后的最后一次系统电话或 VoIP 通话所使用的音频路由。如果蓝牙设备连接后没有进行过系统通话则使用蓝牙。

在 VoIP 通话过程中,用户可以通过系统控制中心(屏幕下方上滑)自主切换音频路由。程序则可以通过 setPreferredInput 接口切换路由。

其他设定

用户指定或者程序指定了蓝牙设备为输入或输出时,系统会自动把输出或输入也切到蓝牙。不支持输入输出在两个不同设备上。

无线蓝牙音箱的录音功能只有系统电话级的才可以使用 (系统电话/FaceTime/CallKit)。