配置音频会话
音频会话类别是标识APP一组音频行为的密钥。通过设置一个类别,我们可以告诉系统我们音频意图,例如当切换铃声/静音开关时,音频是否应继续。我们可以通过这些音频会话的类别和覆盖和修改方法来自定义APP的音频行为。
下表是音频会话的类别的一些细节:
类别 | 通过响铃/静音开关和屏幕锁定来静音 | 中断非混合APP的音频 | 允许音频输入(录制)和输出(播放)| |
---|---|---|---|
AVAudioSessionCategoryAmbient | Yes | No | 仅输出 |
AVAudioSessionCategorySoloAmbient (Default) | Yes | Yes | 仅输出 |
AVAudioSessionCategoryPlayback | No | 默认是Yes,可以通过开关来切换到No | 仅输出 |
AVAudioSessionCategoryRecord | No(锁屏后继续录音) | Yes | 仅输入 |
AVAudioSessionCategoryPlayAndRecord | No | 默认是Yes,可以通过开关来切换到No | 输入和输出 |
AVAudioSessionCategoryMultiRoute | No | Yes | 输入和输出 |
注意:如果要在APP的铃声/静音开关设置为静音且屏幕锁定时,还继续播放音频,就要将UIBackgroundModes音频键添加到APP的信息列表文件。除了使用正确的类别之外,还需要满足此要求。
如上表所示,每个音频会话类别,对特定响应的设置都是不同的:
- 中断非混合APP音频:如果是Yes,那么当APP激活竞争音频会话时,我们的非混合APP的音频就会被中断。
- 静音开关静音:如果是Yes,当用户启动静音开关时,我们音频将静音。(在iPhone上,这个开关叫做响铃/静音开关。)
- 支持音频输入:如果Yes,那么就是允许APP音频输入(录制)。
- 支持音频输出:如果Yes,那么就是允许APP音频输出(播放)。
大多数APP在启动时只需要设置一次类别,但我们也可以根据需要经常更改类别。我们可以在音频会话处于激活状态时,更改它;但是,通常最好能在更改类别或其他会话属性之前,停用音频会话。在会话停用时进行这些更改,可以防止不必要的重新配置音频系统。
音频会话默认行为
iOS有一个默认的音频会话,其预配置如下:
- 支持音频播放,但不允许音频录制。
- 将铃声/静音开关设置为静音模式,可使APP播放的任何音频静音。
- 当设备被锁定时,APP的音频将被静音。
- 当APP播放音频时,任何其他背景音频(如音乐APP正在播放的音频)都将被静音。
这些默认音频会话有它默认的配置,但是在大多数情况下,我们还是应该自定义它,来以更好地满足我们的需要。如果要更改,就要配置APP的音频会话。
配置音频会话
配置音频会话的主要方法,就是设置它的类别。音频会话类别定义一组音频行为。与每个类别相关联的行为不受APP的控制,而是由操作系统设置的。在音频会话的类别和模式中总结了每个类别的行为详细信息。
类别设置APP的基本音频行为时,还可以通过设置类别的模式,来进一步专门化这些行为。例如,IP语音(VoIP)APP将使用AVAudioSessionCategoryPlayAndRecord。通过将音频会话的模式设置为AVAudioSessionModeVoiceChat,可以专门化VoIP的此类行为。这个模式就可确保通过系统提供的信号处理为语音优化信号。
某些类别,是支持通过设置会话的一个或多个类别选项来覆盖其默认行为(可以参考AVAudioSessionCategoryOptions)。例如,与AVAudioSessionCategoryPlayback类别关联的默认行为会在会话激活时中断其他系统音频。一般来说在大多数情况下,播放类的APP是需要这种行为的。但是,如果希望音频与其他系统音频混合,可以通过在会话上设置AVAudioSessionCategoryOptionMixWithOthers选项来覆盖这类行为。
可以调用setCategory:mode:options:error:
方法,来设置音频会话类别,模式和选项的设置是可选的。
使用多路由类别来扩展选项
多路由类别的工作方式与其他类别略有不同。一般来说,其他类别都遵循“后进有效”的规则,也就是说插进输入输出路由的最后一个设备就是主设备。但是,多路由类别使APP能够使用所有连接的端口,而不是仅使用最后一个插入的端口。例如,如果您正在通过HDMI输出路径收听音频,然后插入了耳机,那么APP就会继续通过HDMI输出路径播放音频,同时也通过耳机播放音频。
使用多路由类别,APP还可以将不同的音频流发送到不同的输出路由。例如,APP可以将一个音频流发送到左侧耳机,另一个发送到右侧耳机,第三个发送到HDMI路由。下图中显示了将多个音频流发送到不同音频路由的示例。

选择AirPlay的类别和模式
只有特定的类别和模式支持AirPlay。以下类别同时支持AirPlay的镜像和非镜像版本:
- AVAudioSessionCategorySoloAmbient
- AVAudioSessionCategoryAmbient
- AVAudioSessionCategoryPlayback
AVAudioSessionCategoryPlayAndRecord类别和以下模式仅支持AirPlay的镜像版本:
- AVAudioSessionModeDefault
- AVAudioSessionModeVideoChat
- AVAudioSessionModeGameChat
注意:从iOS 10开始,使用AVAudioSessionCategoryPlayAndRecord类别时,可以通过使用AVAudioSessionCategoryOptionAllowAirPlay选项激活会话来启用非镜像AirPlay输出。
启用背景音频
iOS APP要求我们为某些后台操作启用某些功能。播放类APP所需的一个常见功能是播放背景音频。启用此功能后,当用户切换到其他APP或锁定其iOS设备时,APP的音频可以继续。在iOS中启用高级播放功能,如AirPlay流媒体和图片中的图片播放,也需要此功能。
配置这些功能的最简单方法是使用Xcode。在Xcode中选择APP的target并选择“Capabilities”选项卡。在“Capabilities”选项卡下,将“Background Modes”开关设置为“开”,并从可用模式列表中选择“Audio, AirPlay, and Picture in Picture”选项。

启用此背景模式并使用适当的类别配置音频会话后,APP就可以播放背景音频了。
网友评论