简介
音频会话是一个Singleton对象,您可以使用它来设置应用程序的音频上下文环境,并向系统表达您的应用程序音频行为的意图。
使用此类可以:
- 启用或停用应用程式的音讯工作阶段
- 设置音频会话类别和模式,以便与系统通信如何在您的应用程序中使用音频
- 配置音频设置,如采样率,I / O缓冲区持续时间和通道数
处理音频输出更改 - 响应重要的音频事件,例如更改底层Media Services守护程序的可用性
AVAudioSession使用
AVAudioSession类由AVFoundation框架引入。每个iOS应用都有一个音频会话。这个会话可以被AVAudioSession类的sharedInstance类方法访问。在获得一个AVAudioSession类的实例后,就能通过音频会话单例对象的setCategory:error:方法,来设置iOS应用音频会话类别模式。通过overrideOutputAudioPort:error:方法设置音频会话的overrideOutputAudioPort属性, 或者通过setCategory:withOptions:error:方法来设置音频会话的Audio Route.
NSError *sessionError = nil;
AVAudioSession *audioSession=[AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
if(sessionError){
NSLog(@"Error creating session: %@", [sessionError description]);
}else{
[audioSession setActive:YES error:nil];
}
AVAudioSessionCategory(会话类别的选择)
文章上面说过, 通过音频会话单例对象的setCategory:error:方法,来设置iOS应用语音会话类别和模式。
AVAudioSessionCategoryAmbient 或 kAudioSessionCategory_AmbientSound
用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音
AVAudioSessionCategorySoloAmbient 或 kAudioSessionCategory_SoloAmbientSound
类似于AVAudioSessionCategoryAmbient 不同之处在于它会中止其它应用播放声音。 这个category为默认category。该Category无法在后台播放声音
AVAudioSessionCategoryPlayback 或 kAudioSessionCategory_MediaPlayback
用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。可在后台播放声音.
AVAudioSessionCategoryRecord 或 kAudioSessionCategory_RecordAudio
用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。
AVAudioSessionCategoryPlayAndRecord 或 kAudioSessionCategory_PlayAndRecord
用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,在该Category下声音的默认出口为听筒或者耳机。
AVAudioSessionCategoryAudioProcessing 或 kAudioSessionCategory_AudioProcessing
在不播放或录制音频时使用音频硬件编解码器或信号处理器的类别。例如,在执行离线音频格式转换时。此类别禁用播放(音频输出)和禁用录音(音频输入)。当您的应用处于后台时,音频处理通常不会继续。 但是,当您的应用移至后台时,您可以请求更多时间来完成处理。
注意
并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。
AudioSession Route 选择
当你的iPhone接有多个外接音频接收设备时(耳机,蓝牙音箱等),AudioSession将遵循last-in wins的原则来选择外接设备,即声音将被导向最后接入的设备。
当没有接入任何音频设备时,一般情况下声音会默认从扬声器出来,但有一个例外的情况:在PlayAndRecord这个category下,听筒会成为默认的音频输出设备。如果你想要改变这个行为,可以提供MPVolumeView来让用户切换到扬声器,也可通过overrideOutputAudioPort方法来programmingly切换到扬声器,也可以修改category option为AVAudioSessionCategoryOptionDefaultToSpeaker。
所以, 他应用在扬声器,听筒,耳机,蓝牙音箱之间的切换。
通过AVAudioSessionPortOverride选择音频输出
通过overrideOutputAudioPort:error:方法和下面两个枚举来设置音频会话的overrideOutputAudioPort属性。
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:error];
1
AVAudioSessionPortOverrideNone
不要覆盖输出音频端口。使用此选项将音频输出设备返回到当前音频类别的默认状态。
AVAudioSessionPortOverrideSpeaker
覆盖当前输入和输出,并将音频输出设备到内置扬声器和麦克风。仅适用于AVAudioSessionCategoryPlayAndRecord类别。
通过AVAudioSessionCategoryOptions选择音频输出设备
会话的类别和模式一起定义应用程序如何使用音频。通常,在激活会话之前设置类别和模式。您还可以在会话处于活动状态时设置类别或模式,但这会导致立即更改音频输出设备。
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
1
AVAudioSessionCategoryOptions 枚举值:
//Eligible Input
AVAudioSessionPortUSBAudio
AVAudioSessionPortHeadsetMic
AVAudioSessionPortBuiltInMic
//Eligible Output
AVAudioSessionPortUSBAudio
AVAudioSessionPortLineOut
AVAudioSessionPortHeadphones
AVAudioSessionPortHDMI
AVAudioSessionPortBuiltInSpeaker
overrideOutputAudioPort:设置和AVAudioSessionPortOverride设置的对比
共同点
AVAudioSessionPortOverrideSpeaker和AVAudioSessionCategoryOptionDefaultToSpeaker的使用仅适用于AVAudioSessionCategoryPlayAndRecord类别。
区别
通过调用overrideOutputAudioPort:设置AVAudioSessionPortOverride比使用类别选项AVAudioSessionCategoryOptionDefaultToSpeaker更加短暂。
调用overrideOutputAudioPort:并将AVAudioSessionPortOverride设置为AVAudioSessionPortOverrideSpeaker是临时覆盖要向扬声器播放的输出的一种方法。任何音频输出改变或中断将导致音频被路由回到其正常输出设备,遵循最后入胜的规则。
相反,AVAudioSessionCategoryOptionDefaultToSpeaker修改AVAudioSessionCategoryPlayAndRecord类别的路由行为,使得如果没有使用诸如耳机的其他附件,则音频将总是路由到扬声器而不是接收器。
举个例子, 方法1, 设置之后,如果此时插入耳机,在拔掉。播放的声音会从听筒输出,而不是回到扬声器。
方法2, 设置之后,始终输出到扬声器,而不是其他接收器,如果没有耳机。(简要的说,就是如果有个蓝牙音箱,哪怕接上都不会有声音输出到蓝牙音响,插上耳机,则会有声音输出到耳机。)
作者:DCSnail-蜗牛
来源:CSDN
原文:https://blog.csdn.net/wangyanchang21/article/details/52925031