本文介绍遇到App有多个模块因抢夺AVAudioSession的管理,引起参数不合理设置,导致音频采集和播放异常的问题。
一些iOS App 在集成RTC SDK的同时,也集成了播放器SDK,并且业务场景上播放器和RTC还需要同时工作。因为RTC SDK和播放器SDK在内部都在对AVAudioSession进行管理,设置的参数只考虑了自己的场景需求,并且AVAudioSession是单例,这样就造成RTC和播放器并行工作会出现音频采集和音频播放的各种问题。
为了解决此场景的AVAudioSession冲突的问题,RTC SDK和播放器需要将AVAudioSession的管理交由App来进行统一管理。RTC iOS SDK提供如下API来实现:
setAudioSessionOperationRestriction:DingRtcAudioSessionOperationRestrictionConfigureSession
除了RTC SDK,播放器SDK也需要做同样的设置。
接下来就需要App统一管理AVAudioSession,根据使用场景设置合理Category、Options、Mode。
Category说明
Category | 说明 | |
AVAudioSessionCategorySoloAmbient | 系统默认 - 可以进行播放,但是不能进行录制。 - 当用户将手机上的静音拨片拨到“静音”状态时,此时如果正在播放音频,那么播放内容会被静音。 - 当用户按了手机的锁屏键或者手机自动锁屏了,此时如果正在播放音频,那么播放会静音并被暂停。 - 如果你的App在开始播放的时候,此时QQ音乐等其他App正在播放,那么其他播放器会被静音并暂停。 | |
AVAudioSessionCategoryPlayback | 适合播放场景 - 可以进行播放,但是不能进行录制。 - 当用户将手机上的静音拨片拨到“静音”状态时,此时如果正在播放音频,那么播放内容仍会继续。 - 当用户按了手机的锁屏键或者手机自动锁屏了,此时如果正在播放音频,那么播放内容仍会继续。 - 如果你的App在开始播放的时候,此时QQ音乐等其他App正在播放,那么其他播放器会被静音并暂停。 | |
AVAudioSessionCategoryPlayAndRecord | 适合RTC场景 - 可以进行播放,也可以进行录制。 - 当用户将手机上的静音拨片拨到“静音”状态时,此时如果正在播放音频,那么播放内容仍会继续。 - 当用户按手机的锁屏键或者手机自动锁屏,此时如果正在播放音频,那么播放内容仍会继续。 - 如果你的App在开始播放的时候,此时QQ音乐等其他App正在播放,那么其他播放器会被静音并暂停。 |
Options说明
Option | 适用Category | 作用 |
AVAudioSessionCategoryOption MixWithOthers | AVAudioSessionCategoryPlayback AVAudioSessionCategoryPlayAndRecord | 和其他后台App进行混音。 |
AVAudioSessionCategoryOption DuckOthers | AVAudioSessionCategoryPlayback AVAudioSessionCategoryPlayAndRecord | 和其他后台App进行混音,并且压低其他App声音。 |
AVAudioSessionCategoryOption AllowBluetooth | AVAudioSessionCategoryPlayAndRecord | 支持蓝牙耳机。 |
AVAudioSessionCategoryOption DefaultToSpeaker | AVAudioSessionCategoryPlayAndRecord | 默认免提声音。 |
Mode说明
Mode | 适用Category | 场景 |
AVAudioSessionMode Default | 所有 | 默认模式 |
AVAudioSessionMode VoiceChat | AVAudioSessionCategory PlayAndRecord |
|
对于播放场景建议参数搭配:
AVAudioSessionCategoryPlayback + AVAudioSessionCategoryOptionMixWithOthers
对于RTC场景建议参数搭配有:
AVAudioSessionCategoryPlayAndRecord + AVAudioSessionCategoryOptionMixWithOthers + AVAudioSessionCategoryOptionAllowBluetooth + AVAudioSessionCategoryOptionDefaultToSpeaker + AVAudioSessionModeVoiceChat
开发者可以根据实际情况优化参数设置。比如RTC场景如果希望RTC的声音更清楚些,可以选择AVAudioSessionCategoryOptionDuckOthers,代替推荐的AVAudioSessionCategoryOptionMixWithOthers;如果RTC是音乐场景,希望声音尽量保持原始声音,可以使用AVAudioSessionModeDefault,代替推荐的AVAudioSessionModeVoiceChat,此时为了避免回音,RTC需要启用软件3A。
所有对AVAudioSession参数的设置,请在播放器开始播放之前,在RTC开始推流拉流之前,否则可能会不生效,或者异常。