AVAudioSession音频会话(类别选择/音频输出切换)

简介
音频会话是一个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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 未来将属于思维独特、与众不同的人。重视右脑技能:设计感、故事感、交响力、共情力、娱乐感、意义感。 大脑卫星云图:人...
    叫我失心疯阅读 167评论 0 0
  • 所有QQ号可用@这个QQ代替 多条指令用|间隔,如踢人指令:T|踢|去死 以下为代管可用指令: 清屏 说明:发送设...
    凌风行者阅读 261评论 0 0
  • 这个问题以前我一直是做得不错的,因为对于他们的请求,我是有求必应的,不管是干什么,当然,作为刚入职的菜鸟,...
    公子小白的甜心阅读 242评论 0 0
  • QQ-music 使用原生 JS 实现 QQ 音乐 项目模块: (1) 推荐页面(2) 热门列表(3) 搜索歌曲(...
    YQY_苑阅读 1,192评论 0 0