-
category
1.当前音频会话类别
2.默认的会话类别是AVAudioSessionCategorySoloAmbient
-
categoryOptions
1.与当前音频会话类别相关联的选项
-
mode
1.与当前音频会话类别相关联的模式
2.默认的模式是AVAudioSessionModeDefault
-
availableCategories
1.当前设备上可用的音频会话类别,因为并非每个设备都支持每个音频会话类别,比如AVAudioSessionCategoryRecord在不支持音频输入的设备上不可用
-
availableModes
1.设备上可用的音频会话模式
2.不是每个音频会话模式都可以在每个设备上使用。例如,
avaudiosessionmodevideorecording
在不支持视频记录的设备上不可用模式
-
recordPermission
1.当前录音的权限状态
2.返回的是个枚举值,分别表示未决定,允许,拒绝
-
otherAudioPlaying
1.一个布尔值,指示另一应用程序是否正在播放音频
3.在iOS8或者之后用这个属性secondaryAudioShouldBeSilencedHint,这个属性在判断更为严格
-
secondaryAudioShouldBeSilencedHint
1.跟上个属性差不多,返回 yes的话表示另一个应用程序与非混合音频会话的音频播放
2.应用程序应该使用此属性作为提示来静默与应用程序功能无关的音频
-
Responding to Audio Session Notifications(通知)
-
AVAudioSessionInterruptionNotification
1.如果你在播放音频,但是突然来了电话或者当你在播音乐的时候开了另一个app开始播放,那么把你的播放打断了,这个通知就起作用了
2.这是个通知,只要注册了这个通知,当音频中断时发生就接收到这个通知
3.如果打断的类型为AVAudioSessionInterruptionTypeBegan,那么app的设置AVAudioSession的session就不再处于活跃状态直到打断结束AVAudioSessionInterruptionTypeEnded
4.实际操作1:比如你播放音乐突然来了个电话,如果你注册了这个通知,那么你就收到一个type为AVAudioSessionInterruptionTypeBegan告诉你打断来了,如果电话结束后,又会收到一个type为AVAudioSessionInterruptionTypeEnded并且option 为AVAudioSessionInterruptionOptionShouldResume告诉你打断结束了,并且可以恢复你的音乐播放了
5.实际操作2:比如你在播放音乐,然后你打开另一个音乐播放app,开始播放音乐,那么那么你就收到一个type为AVAudioSessionInterruptionTypeBegan告诉你打断来了,然后你把那个音乐app杀掉,然后你再打开自己的app(一定要打开自己的app,也就在进入前台),你也会收到一个type为AVAudioSessionInterruptionTypeEnded,但是option为0,因为AVAudioSessionInterruptionOptions的枚举只有一个就是AVAudioSessionInterruptionOptionShouldResume=1,所以如果你想进入自己app的时候恢复音乐播放,就不判断打断结束了就恢复播放,下面的代码是在打开结束并且option为AVAudioSessionInterruptionOptionShouldResume才恢复播放
代码示例
/**
* 处理打断
*/
-(void)AVAudioSessionInterruptionNotification:(NSNotification *)notif{
NSDictionary *interruptionDictionary = [notif userInfo];
AVAudioSessionInterruptionType type =
[interruptionDictionary [AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
AVAudioSessionInterruptionOptions option = [interruptionDictionary [AVAudioSessionInterruptionOptionKey] unsignedIntegerValue];
//NSLog(@"打断来了: %@ = %@",type?@"开始":@"结束",option?@"恢复":@"母鸡");
switch (type) {
case AVAudioSessionInterruptionTypeBegan:
[self playPause];
break;
case AVAudioSessionInterruptionTypeEnded:
if (option == AVAudioSessionInterruptionOptionShouldResume){
BOOL status = [self initAVSession];
if (status){
//控制UI,继续播放
[self playResume];
}
}
break;
default:
break;
}
}
-
AVAudioSessionRouteChangeNotification
1.当系统的音频路由发生改变时的系统通知
2.这个通知的userinfo包含了AVAudioSessionRouteChangeReasonKey和AVAudioSessionRouteChangePreviousRouteKey
3.先说AVAudioSessionRouteChangeReasonKe
3.1.AVAudioSessionRouteChangeReasonUnknown
路由的改变原因未知
3.2.AVAudioSessionRouteChangeReasonNewDeviceAvailable
用户的操作(比如插上耳机)
3.3.AVAudioSessionRouteChangeReasonOldDeviceUnavailable
以前的音频输出路径不再可用( 比如用户拔出耳机)
3.4.AVAudioSessionRouteChangeReasonCategoryChange
AVAudioSession对象的category发生改变时,第一次设置session的时候也会发生,比如从AVAudioSessionCategoryPlayback 改变到 AVAudioSessionCategoryPlayAndRecord
3.5.AVAudioSessionRouteChangeReasonOverride
应用程序覆盖了输出路由(不知道什么意思),但是我根据自己的项目测试总结下,比如我现在手机连上A2DP蓝牙播放音乐,那么音乐是从音响出来的,这时我从手机NowPlayingInfo上手动把输出源切换到iphone,你就会收到这个通知的这个type,然后再手动切回到蓝牙,这时收到的type为AVAudioSessionRouteChangeReasonNewDeviceAvailable。
3.6.AVAudioSessionRouteChangeReasonWakeFromSleep
当设备从睡眠中醒来时,路线发生了变化(也没有尝试过这个操作)
3.7.AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory
由于没有适合指定类别的路由,路由发生了更改(不知道怎么操作测试)
3.8.VAudioSessionRouteChangeReasonRouteConfigurationChange
输入和输出端口的集合没有改变,但是它们的配置有端口选择的数据源已经改变了,例如,端口的选定数据源已更改(也不知道怎么操作测试)
-
AVAudioSessionSilenceSecondaryAudioHintNotification
1.当来自其他应用程序的主音频开始并停止时发出的通知
2.这个通知是有限制,也就是只有app在前台并且你的AVAudioSession的对象是激活状态下才能接收到通知,
/**
处理别的app音频播放或者暂停
@param notif <#notif description#>
*/
-(void)handleSilenceSecondaryAudioHint:(NSNotification*)notif{
//guard let userInfo = notification.userInfo,
NSDictionary *audioHinChangeDic = [notif userInfo];
NSInteger type = [audioHinChangeDic[AVAudioSessionSilenceSecondaryAudioHintTypeKey] integerValue];
switch (type) {
case AVAudioSessionSilenceSecondaryAudioHintTypeBegin:
NSLog(@"别的app播放音乐开始");
break;
case AVAudioSessionSilenceSecondaryAudioHintTypeEnd:
NSLog(@"别的app播放音乐暂停");
break;
default:
break;
}
}
-
AVAudioSessionMediaServicesWereLostNotification
1.如果媒体服务器被杀死,注册侦听器将被通知(不知道什么意思)
-
AVAudioSessionMediaServicesWereResetNotification
1.跟上一个通知相反,就是媒体服务重置的时候发出的通知(也不知道什么意思)
-
Working with Audio Routes(使用音频路由)
-
currentRoute
1.描述当前音频输入和输出路由的对象
#pragma mark -Working with Audio Routes(使用音频路由)
AVAudioSessionRouteDescription * routeDes =session.currentRoute;
NSArray * routeInput=routeDes.inputs;
for (AVAudioSessionPortDescription * port in routeInput) {
NSLog(@"当前输入端口名 :%@ 端口类型:%@",port.portName,port.portType);
}
NSArray * routeOutPut=routeDes.outputs;
for (AVAudioSessionPortDescription * port in routeOutPut) {
NSLog(@"当前输出端口名 :%@ 端口类型:%@",port.portName,port.portType);
}
}
-
inputAvailable
1.一个布尔值,指示是否有音频输入路径可用
2.使用此属性可确定设备当前是否支持音频输入
-
availableInputs
1.可用输入端口数组
如果在连接上A2DP的情况
并且设置:
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];//把option设置成fop协议的情况下
----------
NSArray * input=session.availableInputs;
for (AVAudioSessionPortDescription * port in input) {
NSLog(@"端口名 :%@ 端口类型:%@",port.portName,port.portType);
}
打印结果为:
2017-06-30 10:43:29.849581 EYMusicAVPlayer[1445:290947] 端口名 :iPhone 麦克风 端口类型:MicrophoneBuiltIn
2017-06-30 10:43:29.849800 EYMusicAVPlayer[1445:290947] 端口名 :"a2dp的蓝牙名" 端口类型:BluetoothHFP
如果你没有连接A2DP或者连接上了A2DP但是设置的AVAudioSession的option不为AVAudioSessionCategoryOptionAllowBluetooth ,那么打印结果为:2017-06-30 10:48:44.810594 EYMusicAVPlayer[1452:292946] 端口名 :iPhone 麦克风 端口类型:MicrophoneBuiltIn
-
preferredInput
1.用于音频路由的首选输入端口
2.这个属性返回的值是通过setPreferredInput:error:方法设置的,如果它返回的是nil那就表明你没有设置优先级或者你之前设置的优先级的输入已经失效了
AVAudioSessionPortDescription * perferPort=session.preferredInput;
NSLog(@"优先选择的输入端口名:%@ 端口类型:%@",perferPort.portName,perferPort.portType);
-
setPreferredInput:error:
1.为音频路由设置首选输入端口
2.对输入参数的值必须是在该avaudiosessionportdescription对象
并且是available inputs数组中的一个对象
。如果该参数指定了一个尚未成为当前音频路由的端口,应用程序的会话控制音频路由,则该方法发起路由更改以使用首选端口。
3.只有在设置音频会话的类别和模式并激活会话时,才能设置首选输入端口
-
inputDataSources
1.音频会话当前输入端口的可用数据源数组
2.如果当前不存在多个输入源之间的切换,则为0。此功能仅在某些设备和外围设备上支持——例如,在配备有前后麦克风的iPhone上(没有试过)
-
iinputDataSource
1.如果当前不可能在多个输入源之间切换,则此属性的值为零。此功能仅在某些设备和外围设备上支持——例如,在配备有前后麦克风的iPhone上
-
setInputDataSource:error:
1.你可以设置输入源正是其中的avaudiosessiondatasourcedescription对象
inputdatasources
阵列。只在某些设备和外围设备上支持输入源之间的切换;例如,这种方法可用于在配备有iPhone的iPhone的前后麦克风之间进行选择
-
outputDataSources
-
outputDataSource
-
setOutputDataSource:error:
这三个输出跟前三个输入概念是一样的就不做特别说明了
-
overrideOutputAudioPort:error:
1.临时更改当前音频路由
-
Working with Audio Channels(使用音频通道)
检查并配置当前音频设备上可用的音频输入和输出通道的数目。
-
inputNumberOfChannels
1.当前路由的音频输入通道数
2.可通过kvo监听这个属性的改变
-
maximumInputNumberOfChannels
1.当前音频路由可用的最大输入通道数
-
preferredInputNumberOfChannels
1.当前路由的输入通道的首选数目
-
setPreferredInputNumberOfChannels:error:
1.设置当前路由的输入通道的首选数目
-
outputNumberOfChannels
-
maximumOutputNumberOfChannels
-
preferredOutputNumberOfChannels
-
setPreferredOutputNumberOfChannels:error:
这三个是输出通道的相关的,跟前四个输入的概念差不多,就不做介绍了
-
Working with Audio Device Settings(使用音频设备设置)
检查和配置音频设备设置,如输入增益、采样速率和I/O缓冲区持续时间
-
inputGain
1.应用于与会话关联的输入的增益
2.范围是浮点值从0到1,其中0表示最低增益设置,1表示最高增益设置
3.可以通过kvo监听这个属性
-
inputGainSettable
1.一个布尔值,指示是否可以设置输入增益
2.并非所有设备都支持可变增益,在尝试设置输入增益之前,请检查此属性
-
setInputGain:error:
1.将输入增益更改为指定的值
2.在调用此方法之前,请检查inputgainsettable
属性来确定输入的增益为可设置的
-
outputVolume
1.由用户设置的全系统输出量
2.只读的属性
3.系统范围的输出量只能由用户直接设置;在应用程序中提供音量控制,使用MPVolumeView类
4.可通过kvo监听
-
inputLatency
1.音频输入的延迟,以秒计算
2.只读
-
outputLatency
1.音频输出的等待时间,以秒为单位
2.只读
-
sampleRate
1.当前音频采样速率,以赫兹为单位
-
preferredSampleRate
1.首选采样率,以赫兹为单位
-
setPreferredSampleRate:error:
1.设置输入和输出的首选采样率。
2.参数:使用的硬件采样速率。硬件采样率的可用范围是依赖于设备的。它通常在8000到48000赫兹之间
-
IOBufferDuration
1.当前I/O缓冲区的持续时间,以秒为单位
-
preferredIOBufferDuration
1.当前I/O缓冲区的持续时间,以秒为单位。
-
setPreferredIOBufferDuration:error:
1.设置首选音频I/O缓冲区持续时间,以秒为单位
-
Setting the Aggregated I/O Preference(设置聚合的I/O首选项)
从iOS 10开始,AVCaptureSession已经改变了支持iPhone和iPad的默认音频输入配置,支持实时照片功能。此更改允许在不中断背景音频回放的情况下拍摄现场照片。通过设置聚合的I/O首选项配置首选音频输入行为
AVCaptureSession:一种管理捕获活动并协调来自输入设备的数据流以捕获输出的对象