AVAudioSession类由AVFoundation框架引入。每一个iOS应用都有一个音频会话。这个会话能够被AVAudioSession类的sharedInstance类方法访问,以下html
setCategory: AVAudioSessionCategoryPlaybackios
error: &setCategoryErr];session
//设置音频是否启用app
[[AVAudioSession sharedInstance]框架
setActive: YESide
error: &activationErr];优化
AVAudioSessionCategorySoloAmbientui
这个类别很是像AVAudioSessionCategoryAmbient类别,除了会中止其余程序的音频回放,好比iPod程序。当设备被设置为静音模式,你的音频回放将会中止。spa
AVAudioSessionCategoryRecord.net
这会中止其余应用的声音(好比iPod)并让你的应用也不能初始化音频回放(好比AVAudioPlayer)。在这种模式下,你只能进行录音。使用这个类别,调用AVAudioPlayer的prepareToPlay会返回YES,可是调用play方法将返回NO。主UI界面会照常工做。这时,即便你的设备屏幕被用户锁定了,应用的录音仍会继续。
AVAudioSessionCategoryPlayback
这个类别会静止其余应用的音频回放(好比iPod应用的音频回放)。你可使用AVAudioPlayer的prepareToPlay和play方法,在你的应用中播放声音。主UI界面会照常工做。这时,即便屏幕被锁定或者设备为静音模式,音频回放都会继续。
AVAudioSessionCategoryPlayAndRecord
这个类别容许你的应用中同时进行声音的播放和录制。当你的声音录制或播放开始后,其余应用的声音播放将会中止。主UI界面会照常工做。这时,即便屏幕被锁定或者设备为静音模式,音频回放和录制都会继续。
AVAudioSessionCategoryAudioProcessing
这个类别用于应用中进行音频处理的情形,而不是音频回放或录制。设置了这种模式,你在应用中就不能播放和录制任何声音。调用AVAPlayer的prepareToPlay和play方法都将返回NO。其余应用的音频回放,好比iPod,也会在此模式下中止。
AVAudioSessionCategoryAmbient
这个类别不会中止其余应用的声音,相反,它容许你的音频播放于其余应用的声音之上,好比iPod。你的应用的主UI县城会工做正常。调用AVAPlayer的prepareToPlay和play方法都将返回YES。当用户锁屏时,你的应用将中止全部正在回放的音频。仅当你的应用是惟一播放该音频文件的应用时,静音模式将中止你程序的音频回放。若是正当iPod播放一手歌时,你开始播放音频,将设备设为静音模式并不能中止你的音频回放。
2016-07-26
本文内容主要来源于 Working with Categories。
对于 Audio Session 来讲,与之对应的 Category 是阐释其音频行为的关键信息。好比:你的 App 的声音是否应该受到手机的静音键的控制、你的 App 使不使用音频输入或输出、其余音乐可否和你的 Audio 共存播放等等。
每一种 Category 都指定了是否支持下列这些能力:
Interrupts non-mixable apps audio
:是否打断不支持混音播放的应用。若是是,则当你的应用的音频开始播放时,则那些不支持混音播放的应用的音频会被打断。Silenced by the Silent switch
:是否响应手机静音键。若是是,则当手机静音键被拨至静音状态时,你的音频会被静音。Supports audio input
:是否支持音频输入。若是是,你的应用就能够录音。Supports audio output
:是否支持音频输出。若是是,你的应用就能够播放音频。下面是各类 Category 的能力表格:
Category | 是否会被静音键或锁屏键静音 | 是否打断不支持混音播放的应用 | 是否容许音频输入/输出 |
---|---|---|---|
AVAudioSessionCategoryAmbient | Yes | NO | 只输出 |
AVAudioSessionCategoryAudioProcessing | - | YES | 无输入和输出 |
AVAudioSessionCategoryMultiRoute | NO | YES | 支持输入和输出 |
AVAudioSessionCategoryPlayAndRecord | NO | 默认 YES,可重写开关置为 NO | 支持输入和输出 |
AVAudioSessionCategoryPlayback | NO | 默认 YES,可重写开关置为 NO | 只输出 |
AVAudioSessionCategoryRecord | NO(锁屏时依然保持录制) | YES | 只输入 |
AVAudioSessionCategorySoloAmbient | YES | YES | 只输出 |
大部分应用只须要在启动时设置一下 Category 便可,不过你是能够随时修改 Audio Session 的 Category,也能够随时激活和关闭 Audio Session。当你的 Audio Session 是 Inactive 的,Category 的请求会在你激活它时发送,若是是 Active 的,则当即发送。
每一种 Category 最准确的行为定义是由系统控制而不是你的应用,苹果可能会在未来从新定义不一样的 Category 的行为,因此你最好是选择一种与你的应用使用音频方式匹配的 Category 来用。
下面列一下各类 Category 的使用场景:
AVAudioSessionCategoryAmbient,只支持音频播放。适用于把音频做为辅助性元素而非不可获取特性的应用,使用这个 Category,你的音频会被静音键和锁屏键静音。
AVAudioSessionCategorySoloAmbient,这个是默认使用的 Category,只支持音频播放。音频会被静音键和锁屏键静音。这个 Category 和 AVAudioSessionCategoryAmbient 的惟一不一样在于它会打断其余应用的音频播放。
AVAudioSessionCategoryPlayback,只支持音频播放。你的音频不会被静音键和锁屏键静音。当你的应用把音频播放做为重要功能时,你可使用这个 Category。
有一点须要注意的是,当你选择那些支持在静音键切到静音状态以及锁屏键切到锁屏状态下仍然支持你的音频继续播放的 Category 时,你必须在你的应用中开启 Background Audio 的能力,详见UIBackgroundModes。而且,一般你不该该经过 idleTimerDisabled 接口关闭系统的 Sleep Timer。若是你关闭了,那你应该把 idleTimerDisabled 置回 NO,以避免你的应用会禁止自动屏幕锁定,毕竟锁屏并不会影响你的音频播放,你干吗关闭它呢。Sleep Timer 能够确保你的屏幕在用户无操做一段时间后自动变暗并锁定来省电。
除了 AVAudioSessionCategoryMultiRoute 外,其余的 Category 都遵循 last in wins 原则,即最后接入的音频设备做为输入或输出的主设备。
AVAudioSessionCategoryMultiRoute 并非简单的遵循 last in wins 原则,AVAudioSessionCategoryMultiRoute 容许你的使用全部链接的输出接口而不只是最后连上的接口。好比,当你正在经过 HDMI 输出路径听音频,这时又插上了耳麦,你的应用能够同时在 HDMI 和耳麦都输出音频。
在 AVAudioSessionCategoryMultiRoute 下,你的应用能够发送不一样的音频流到不一样的输出路径。例如,你的应用能够将一条音频流发送到你的左耳麦,另外一条音频流发送到右耳麦,并将第三条流发送到 HDMI 路径。以下图所示:
AVAudioSessionCategoryMultiRoute 支持下列输出组合:
AVAudioSessionCategoryMultiRoute 支持单输入接口。
代码以下:
NSError *setCategoryError = nil;
BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&setCategoryError];
// BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDuckOthers error:&setCategoryError];
if (!success) { /* handle the error in setCategoryError */ }
正如使用 Category 能够定制应用的音频行为,咱们使用 Mode 则能够定制 Category 的行为。可选的 Mode 有这些:
Mode | 兼容的 Category |
---|---|
AVAudioSessionModeDefault | All |
AVAudioSessionModeVoiceChat | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionModeGameChat | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionModeVideoRecording | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord |
AVAudioSessionModeMoviePlayback | AVAudioSessionCategoryPlayback |
AVAudioSessionModeMeasurement | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback |
AVAudioSessionModeVideoChat | AVAudioSessionCategoryPlayAndRecord |
除了这些 Mode 外,有时在定制你的 Category 时,你还须要使用到一些 Option:
Option | 说明 | 兼容的 Category |
---|---|---|
AVAudioSessionCategoryOptionMixWithOthers | 容许和其余音频 mix | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute |
AVAudioSessionCategoryOptionDuckOthers | 智能调低冲突音频音量 | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute |
AVAudioSessionCategoryOptionAllowBluetooth | 容许蓝牙音频输入 | AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionCategoryOptionDefaultToSpeaker | 默认输出音频到扬声器 | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionModeDefault,默认模式能够与全部的 Category 兼容使用,并配置设备用于通常用途。
AVAudioSessionModeVoiceChat,通常用于 VoIP 类型的应用。这个模式只用于 AVAudioSessionCategoryPlayAndRecord Category。在这个模式下,用于音频的信号会由系统提供的信号处理程序优化,而且这个模式会配置上 AVAudioSessionCategoryOptionAllowBluetooth 这个选项。这个设置下,当系统内置麦克风被使用时,系统会自动选择最佳内置麦克风组合支持语音聊天,从而优化语音聊天体验。
AVAudioSessionModeVideoChat,通常用于视频聊天应用,好比 FaceTime。这个模式只用于 AVAudioSessionCategoryPlayAndRecord Category。在这个模式下,用于音频的信号会由系统提供的信号处理程序优化,而且这个模式会配置上 AVAudioSessionCategoryOptionAllowBluetooth 和 AVAudioSessionCategoryOptionDefaultToSpeaker 选项。这个设置下,当系统内置麦克风被使用时,系统会自动选择最佳内置麦克风组合支持视频聊天,从而优化视频聊天体验。
苹果推荐音频或视频聊天应用也使用 Voice-Processing I/O Unit,这个模块提供了一系列的特性来支持 VoIP 类应用。
AVAudioSessionModeGameChat,通常用于游戏类应用。使用 GKVoiceChat 对象的应用会自动设置这个模式和 AVAudioSessionCategoryPlayAndRecord Category。这个模式使用的路径参数和 AVAudioSessionModeVideoChat 一致。
AVAudioSessionModeVideoRecording,通常用于须要使用摄像头采集视频的应用。这个模式只用于 AVAudioSessionCategoryPlayAndRecord 和 AVAudioSessionCategoryRecord 这两个 Category。在这个模式下,信号会被系统提供的信号处理程序修改。这个模式与 AVCaptureSession API 结合来用能够更好地控制音视频的输入输出路径。好比,经过设置 automaticallyConfiguresApplicationAudioSession 属性可让系统根据所使用的设备自动选择最佳输出路径。
AVAudioSessionModeMeasurement,通常用于那些要最小化系统自带的音视频信号处理流程对信号的影响的应用。这个模式只用于 AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryRecord、AVAudioSessionCategoryPlayback 这几种 Category。输入信号由设备的主麦克风来路由。
AVAudioSessionModeMoviePlayback,通常用于播放电影或其余视频的应用。这个模式只用于 AVAudioSessionCategoryPlayback Category。
如下 Category 支持「镜像」和「非镜像」版本的 AirPlay:
此外:
Mode 只有在和 AVAudioSessionCategoryPlayAndRecord Category 配合使用时才支持 AirPlay,下面的 Mode 只支持「镜像」版本的 AirPlay:
你能够有多种方式来调优 Category,下面举几个例子:
从 iOS7 以后,录制音频的权限须要用户受权才能得到。若是用户不给你权限,那么你录制的就是静音。当你使用一个须要录制权限的 Category 来定制你的 Audio Session 时,系统会自动弹出权限申请提示给用户。
除了让系统自动弹出权限申请提示外,你还能够经过 requestRecordPermission: 方法来向用户请求权限。