1 简介
AVAudioSession类由AVFoundation框架引入。每个iOS应用都有一个音频会话,它是一个单例对象,您可以使用它来设置应用程序的音频上下文环境,并向系统表达您的应用程序音频行为的意图。
用途
- 启用或停用应用程式的音讯工作阶段 。
- 设置音频会话类别和模式
- 设置类别setCategory:error:
- 设置模式setMode: error:
- 配置音频设置,如采样率,I / O缓冲区持续时间和通道数
处理音频输出更改 。 - 响应重要的音频事件,例如更改底层Media Services守护程序的可用性
- 通过overrideOutputAudioPort:error:方法设置音频会话的overrideOutputAudioPort属性,
- 通过setCategory:withOptions:error:方法来设置音频会话的Audio Route.
2 AVAudioSessionCategory(会话类别)
会话类型 | 说明 | 是否要求输入 | 是否要求输出 | 是否遵循静音键和屏幕关闭 |
---|---|---|---|---|
AVAudioSessionCategoryAmbient 或kAudioSessionCategory_AmbientSound | (1)混音播放,可以与其他音频应用同时播放,(2)用于以非语音为主的应用(3)非独占 | N | Y | Y |
AVAudioSessionCategorySoloAmbient或 kAudioSessionCategory_SoloAmbientSound | (1)为默认category(2) 独占播放(3)无法在后台播放声音 | N | Y | Y |
AVAudioSessionCategoryPlayback或 kAudioSessionCategory_MediaPlayback | (1)后台播放(2)用于以语音为主的应用(3)独占的 | N | Y | N |
AVAudioSessionCategoryRecord或 kAudioSessionCategory_RecordAudio | (1)录音模式,用于录音时使用。(2)除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。(3)只提供单纯录音功能。 | Y | N | N |
AVAudioSessionCategoryPlayAndRecord 或 kAudioSessionCategory_PlayAndRecord | (1)用于语音聊天应用(如微信)(2) 播放和录音,此时可以录音也可以播放(3)只有它允许修改默许音频播放设备:听筒还是外放,在该Category下声音的默认出口为听筒或者耳机。 | Y | Y | N |
AVAudioSessionCategoryAudioProcessing 或kAudioSessionCategory_AudioProcessing | (1) 硬件解码音频,此时不能播放和录制。(2)例如,在执行离线音频格式转换时。此类别禁用播放(音频输出)和禁用录音(音频输入)。当您的应用处于后台时,音频处理通常不会继续。 但是,当您的应用移至后台时,您可以请求更多时间来完成处理。 | N | N | N |
AVAudioSessionCategoryMultiRoute | 多种输入输出,例如可以耳机、USB设备同时播放 | Y | Y | N |
3 AVAudioSessionCategoryOptions(会话类别options)
- AVAudioSessionCategoryOptionMixWithOthers
- 当一个app即包含audio输入又包含输出的时候,设置这个选项在激活会话时不会打断其他应用程序的音频播放 。
- 可用类别
- AVAudioSessionCategoryPlayback
- AVAudioSessionCategoryPlayAndRecord
- AVAudioSessionCategoryMultiRoute
- AVAudioSessionCategoryOptionDuckOthers
- 激活会话时降低其他程序的音频播放声音 ,主要是体现当前音频的重要性,比如说开车听歌的时候,导航的声音就属于比较重要的或者是需要特别关注的就可以是用这个选项 。
- 会影响其他应用,不用时需要deactivate audio session
- 可用类别
- AVAudioSessionCategoryAmbient
- AVAudioSessionCategoryPlayAndRecord
- AVAudioSessionCategoryPlayback
- AVAudioSessionCategoryMultiRoute
AVAudioSessionCategoryOptionAllowBluetooth
- 允许可免提蓝牙设备可使用输入通道
- 可用类别
- AVAudioSessionCategoryRecord
- AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryOptionDefaultToSpeaker
- 在没有其他通道的时候默认选择内置扬声器
- 可用类别
- AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWIthOthers
- 你的app偶尔的使用音频播放
- 可用类别
- AVAudioSessionCategoryPlayback
- AVAudioSessionCategoryPlayAndRecord
- AVAudioSessionCategoryMultiRoute
AVAudioSessionCategoryOptionAllowBluetoothA2DP
- 立体声蓝牙
- 可用类别
- AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryOptionAllowAirPlay
- 远程AirPlay设备
- 可用类别
- AVAudioSessionCategoryPlayAndRecord
//如果设置了这个选项,在关闭这个session时为了确保执行当前session之前被打断的正在播放的 audio app能都收到resume消息
[myAudioSession setActive: NO with Options: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error: <#Your error object, or nil for testing#>];
4 AudioSession Route
- 默认音频输出为扬声器
- 在PlayAndRecord这个category下,默认音频输出为听筒。
- 扬声器,听筒,耳机,蓝牙音箱之间的切换
- 利用MPVolumeView来让用户切换到扬声器,
- 通过overrideOutputAudioPort方法来切换到扬声器
- 修改category 的option为AVAudioSessionCategoryOptionDefaultToSpeaker
- 多个外接音频接收设备时(耳机,蓝牙音箱等),将遵循last-in wins的原则来选择外接设备,即声音将被导向最后接入的设备。
5 通过AVAudioSessionPortOverride选择音频输出
4.1 AVAudioSessionPortOverrideNone
不要覆盖输出音频端口。使用此选项将音频输出设备返回到当前音频类别的默认状态。
4.2 AVAudioSessionPortOverrideSpeaker
覆盖当前输入和输出,设置音频输出设备为内置扬声器和麦克风。仅适用于AVAudioSessionCategoryPlayAndRecord类别。
4.3代码例子
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:error];
6 通过AVAudioSessionCategoryOptions选择音频输出设备
会话的类别和模式一起定义应用程序如何使用音频。通常,在激活会话之前设置类别和模式。您还可以在会话处于活动状态时设置类别或模式,但这会导致立即更改音频输出设备。
代码例子
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
AVAudioSessionCategoryOptions 枚举值:
//Eligible Input
AVAudioSessionPortUSBAudio
AVAudioSessionPortHeadsetMic
AVAudioSessionPortBuiltInMic
//Eligible Output
AVAudioSessionPortUSBAudio
AVAudioSessionPortLineOut
AVAudioSessionPortHeadphones
AVAudioSessionPortHDMI
AVAudioSessionPortBuiltInSpeaker
6 overrideOutputAudioPort:和AVAudioSessionPortOverride的对比
共同点
- 使用仅适用于AVAudioSessionCategoryPlayAndRecord类别。
区别
- overrideOutputAudioPort:是临时覆盖。任何音频输出改变或中断将导致音频被路由回到其正常输出设备,遵循最后入胜的规则
- AVAudioSessionCategoryOptionDefaultToSpeaker,在没有使用耳机等其他附件时,音频将总是路由到扬声器而不是接收器。
举个例子
方法1, 设置之后,如果此时插入耳机,在拔掉。播放的声音会从听筒输出,而不是回到扬声器。
方法2, 设置之后,始终输出到扬声器,而不是其他接收器,如果没有耳机。(简要的说,就是如果有个蓝牙音箱,哪怕接上都不会有声音输出到蓝牙音响,插上耳机,则会有声音输出到耳机。)
1 AVAudioSession音频会话(类别选择/音频输出切换)
2 iOS开发系列–音频播放、录音、视频播放、拍照、视频录制