iOS端对AVAudioSession的统一管理

本文介绍遇到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

  • 这种模式适用于实时语音聊天或类似的应用场景。

  • 它优化了双向通信(即同时收听和讲话),比如在进行视频通话、VoIP电话等时使用。

对于播放场景建议参数搭配:

AVAudioSessionCategoryPlayback + AVAudioSessionCategoryOptionMixWithOthers

对于RTC场景建议参数搭配有:

AVAudioSessionCategoryPlayAndRecord + AVAudioSessionCategoryOptionMixWithOthers + AVAudioSessionCategoryOptionAllowBluetooth + AVAudioSessionCategoryOptionDefaultToSpeaker + AVAudioSessionModeVoiceChat

开发者可以根据实际情况优化参数设置。比如RTC场景如果希望RTC的声音更清楚些,可以选择AVAudioSessionCategoryOptionDuckOthers,代替推荐的AVAudioSessionCategoryOptionMixWithOthers;如果RTC是音乐场景,希望声音尽量保持原始声音,可以使用AVAudioSessionModeDefault,代替推荐的AVAudioSessionModeVoiceChat,此时为了避免回音,RTC需要启用软件3A。

所有对AVAudioSession参数的设置,请在播放器开始播放之前,在RTC开始推流拉流之前,否则可能会不生效,或者异常。