AVAduioSession中的相关属性

  • 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:一种管理捕获活动并协调来自输入设备的数据流以捕获输出的对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 原文链接http://www.cnblogs.com/kenshincui/p/4186022.html 音频在i...
    Hyman0819阅读 21,661评论 4 74
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,659评论 0 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 白天 当单薄的天空 收纳起阳光 建筑与建筑的缝隙里 就泄露出了风的消息 我们发现 一杯水没有了影子 就开始了共鸣 ...
    IANXXX阅读 272评论 0 0
  • 我愿做一棵树 站在你每日必经的路旁 供你歇息乘凉 我愿做一棵草 让你踏着 每日仰望你甜美的面庞 我愿做一颗星 夜空...
    阳光诗文阅读 205评论 6 22