一、介绍
Audio 是被iOS系统接管的服务,系统通过Audio Session管理了第三方App、系统内置App以及设备级别的音频行为。
你可以通过Audio Session告诉系统你想在你的App中怎样使用音频,Audio Session扮演了Application与操作系统或者说是底层音频硬件之间的中介者,这样在和音频硬件进行互动时就不用进行详细的配置说明,将这些细节由Audio Session管理可以可以确保音频的使用体验。
二、概要
我们使用AVAudioSession实例来和App的audio session来进行交互,
- 配置audio session的 category and mode 来告诉系统你的App打算如何使用音频;
- 激活App的audio session从而使得category and mode生效;
- 订阅audio session的notifications,并对audio interruptions 和 route changes事件作出响应;
- 执行高级的音频设配配置,例如设置采样率、 I/O buffer duration 和 声道数;
三、Category
audio session category 是代表音频行为的主要机制,通过设置category可以设置App用是输入还是输出路由,并且可以设置在播放音频的同时是否同时播放其他App的音乐。
AVFoundation定义了一系列的audio session categories,不同的categories分别可以支持playback、recording、playback with recording。
Audio Session Category 的表现行为
Category | 是否遵循静音键 OR锁屏 |
是否打断其他App | 要求输入或输出 |
---|---|---|---|
AVAudioSessionCategoryAmbient | Yes | No(混音播放) | Output only |
AVAudioSessionCategorySoloAmbient | Yes | YES(独占播放) | Output only |
AVAudioSessionCategoryPlayback | NO | Yes(独占播放,可后台播放) NO(override switch) |
Output only |
AVAudioSessionCategoryRecord | NO (锁屏录音继续) |
YES(录音模式) | Input only |
AVAudioSessionCategoryPlayAndRecord | No | Yes(播放和录音,可录音可播放) NO(override switch) |
Input and output |
AVAudioSessionCategoryMultiRoute | No | Yes(多种输入输出, 例如可以耳机、USB设备同时播放) |
Input and output |
AVAudioSessionCategoryAudioProcessing | No | Yes(硬件解码音频, 此时不能播放和录制) |
Input and output |
总结各种Category的特点
- AVAudioSessionCategoryAmbient
Ambient中文意思是四周的,环绕的,只用于播放,并且可以和其他App音频的音频一起播放,例如可以玩游戏的同时听其他App播放的音乐。跟随静音键和锁屏静音。
- AVAudioSessionCategorySoloAmbient
Solo中文意思是独奏,独唱的,也是只用于播放,但是不能和其他App音频的音频一起播放。跟随静音键和锁屏静音。
- AVAudioSessionCategoryPlayback
只用于播放,不能和其他App一起播放,不跟随锁屏或者静音键,同时可以在退后台的时候继续播放。像QQ音乐,会使用这种模式
- AVAudioSessionCategoryRecord
只用于录音,启动时会打断其他App的音频
- AVAudioSessionCategoryPlayAndRecord
只用于录音和播放,比如在微信VOIP语音通话场景,自己既需要录音,也需要播放其他人的声音
- AVAudioSessionCategoryMultiRoute
其他的Category都是使用最后一个接入的设备作为输入输出的源,MultiRoute可以使用所有的接入设备作为输出源,例如可以将声音同时输出到耳机和HDMI设备;支持的组合如下:
USB and headphones、HDMI and headphones、LineOut and headphones,另外只支持一个录音设备的接入;
四、提示
后台播放
为了让自己的App可以在锁屏、静音键打开、退后台、画中画的情况下继续播放音频,或
需要在Info.plist文件的UIBackgroundModes
中加入audio
或者项目的配置页中Background Modes中的“Audio, AirPlay, and Picture in Picture”选项打开
category切换
官方建议在更改audio session的category或者其他的audio session的属性前,最好将audio session进行deactivate,这样可以避免audio系统在category等配置改变的时候进行不必要的重新配置。