## 简介
IOS通过<em>audio sessions</em>和AVAudioSession中的<strong>API</strong>来实现对于不同app之间、同一app内及硬件层面的各种音频行为。
<center>
![图片来自官方文档](https://box.kancloud.cn/c6dec46fa43d73a6852d05757b944fd1_563x417.png)
</center>
AVAudioSession中的API可以处理类似这样的问题:
- 手机在从铃声切换到静音模式时,app中的音频是否需要静音?举例来说,旨在帮助用户在会议中做笔记的app应当在静音模式下静音,以免打扰他人;而具有发音功能的词典类app则应保证不被静音模式影响,在用户需要的时候播放声音。
- 当app的音频开始播放的时候,系统在播放的其他音频是否应该继续?在类似让用户跟着伴奏利用app中的功能一起合奏的app中,背景音乐当然要继续;但如果app的功能是网络电台,那么就应该让其他的声音都停止。
IOS设备中的音频使用场景十分复杂:用户随时可能插拔耳机、接打电话,系统的闹钟也可能在使用其他音频的过程中a响起。通过使用audio session中的API来作出特定的配置,只需使用很少的代码就可以优雅的对系统请求作出回应。
----------
###概览
使用AVAudioSession可以:
- 选择合适的输入/输出源(route)
- 决定如何从其他app中集成音频
- 处理来自其他app的“骚扰”
- 为某一的类型的app自动配置音频?(automatically configure audio for the type of app you are creating)
####音频会话(Audio Session)包含了一系列的音频行为
音频会话是app和IOS之间的媒介,用来为app配置相关的音频属性和行为。在加载过程中,app会自动创建一个音频会话的单例。
####用类别(categories)描述音频身份(role)
音频会话类别是用来描述音频行为的主要机制。通过设置类别可以表明:app是否使用输入/输出源,在播放音频时是否支持其他背景音乐的播放和其他属性。开发者设计的音频行为应当符合用户的期望。
开发者可以通过七个类别和一些override and modifier switches,结合app的身份来定制音频行为。不同的类别分别支持后台播放(playback)、录音和后台录音等功能。当系统了解app的音频身份后,会为app提供合适的硬件资源,令其免于受到设备上的其他音频事件的干扰。
####模式刻画类别(Modes Customize Categories)
用户对于特定种类的app的(音频)表达方式会有特定的期待。模式被用来刻画类别的行为。举例来说,系统可能会为使用默认模式和录像模式的app选择不同的麦克风,或者为用于录像场景的app启用麦克风信号处理。
####基于通知(Notifications)的中断处理机制(interruption handling)
音频中断是指是app的音频会话的激活状态失效,并导致app音频马上终止的行为。如果一个未被系统归类为可以和自己的音频会话混合的其他会话被激活,就会对app产生中断。当会话被中断时,系统会向app发出一个“你被中断”信号。app可以在接到这个信号的时候完成保存状态、更新UI等操作。
开发者可以通过向AVAudioSession中的AVAudioSessionInterruptionNotification注册来处理中断。编写自己的中断开始及中断结束方法,以便对用户造成尽可能小的中断操作,并提供最优雅的恢复方案。
####基于通知的音频源切换处理
用户在插拔外接音频设备或插拔耳机的时候,会期待系统能够按自己的想法进行输入输出源的切换。《IOS Human Interface Guidelines》中关于声音的章节描述了这些用户期待,并提供了一些关于如何满足这个期待的指导。通过在AVAudioSessionRouteChangeNotification中注册来处理音频源的切换。
####类别的特性可调整
开发者可以用不同的方式来对音频会话类别进行调整,来改变类别的属性,包括:
* 允许(缺省条件下不能与其他音频混合的)类别与其他(来自QQ音乐等app的)音频混合。
* 将音频的输出源从输入源改为扩音器。
* 允许蓝牙音频输入源。
* 在app的音频播放时,要求其他的音频减小音量。
* 在运行时为app选择最优的硬件设备。在app运行时,开发者的代码可以根据当前的设备环境及用户插拔设备引发的变化,进行动态的调整和适应。
####前置知识
在学习这些内容前,开发者需要对Cocoa Touch开发有一定的了解(App Programming Guide for IOS中关于Core Audio和Core Audio Overview中的章节)。同时,由于音频会话通常会基于终端用户实际的使用场景,因此也需要对IOS设备,和IOS Human Interface Guidelines(特别是Sound章节)有所了解。
####其他
参见以下资料:
* AVAudioSession Class Reference,官方手册中关于AudioSession类的介绍
* AddMusic,样例代码,展示如何协调app间的音频操作
>
以上内容翻译自[苹果官方文档](https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html),仅供学习,请勿用于商业用途,侵删。转载注明出处。