udioession配置研究

在前面配置Category时, 我们可以增加Options来简单调整! 注意Options与Category类型相关, 在配置前, 先判断 Options是否匹配Category, 可以使用[AVAudioSession sharedInstance].availableCategories来查看当前Category支持的Options,常规的选项.

目前主要的选项有这几种,都有对应的使用场景,除此之外,在iOS9还提供了AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers

iOS10又新加了两个AVAudioSessionCategoryOptionAllowBluetoothA2DP 、AVAudioSessionCategoryOptionAllowAirPlay用来支持蓝牙A2DP耳机和AirPlay

配置选项常见的API:

不过这个过程,感觉缺少一个setOption的接口,既然已经是当前处于的Category,干嘛还要再设置选项的时候再指定Category呢?

通过Category和Options的微调, 基本覆盖了主要的场景, 在上面的逻辑还需要针对不同的子场景进行调整, 就需要配置Mode, 具体7个子mode如下:

我们一般都是在设置Category以后再才设置 Mode:

注意app中的AVAudioSession通常使用方法[AVAudioSession sharedInstance] 使用一个单例对象去配置, 我们在启动时, 可以获取它的内部的一些属性:

默认情况下, availableInputs 只会拥有iPhone的前置内置麦克风!

注意我们可以在初始条件下打印inputDataSources, 通过AVAudioSessionDataSourceDescription的内容, 可以知道设备拥有的麦克风数目.

实际上输入数据源, 可能有多个, 我们直接通过设置Category等配置系统会自动帮我们选择具体使用的麦克风

当我们带上Airpod蓝牙耳机, 并配置Options为AVAudioSessionCategoryOptionAllowBluetooth时, :

AVAudioSessionCategoryOptionAllowBluetooth情况下, availableInputs 会拥有iPhone的前置内置麦克风(有多个)以及airpod蓝牙麦克风!

当我们带上 airpods 蓝牙耳机, 并插上有线耳机, 并配置AVAudioSessionCategoryOptionAllowBluetooth 时, 能看到可用的音频输入方式为: 内置麦克风, 有线麦克风, 耳机麦克风:

当我们带上 airpods 蓝牙耳机, 并插上有线耳机, 并配置Option = 0(不配置蓝牙) 时, 打印的可用音频Inputs只有内置的前置麦克风和有线耳机麦克风:

Apple 的文档中提到, 当我们使用 setCategory...方法时, 如果当前AVAudioSession已经激活, 系统就会立即改变Category, 如果是未激活状态inActive, 则需要我们设置Active==YES才会激活对应状态

常见的激活API:

停止激活API:

当APP在使用时, 可能同时接入多个外设音频(有线耳机, 蓝牙耳机, 默认扬声器), 默认情况下, AudioSession会根据Last in Wins原则选择, 就是声音会导向最后接入的设备.

默认情况下, 声音会从默认扬声器出来. 但是当我们设置Category是在PlayAndRecord时, iPhone会将默认的输出修改成听筒, 也就是前置摄像头旁边的一个扬声器(支持贴耳的近距离检测!!!), 这种场景下, 有以下两种方式将输出修改成扬声器:

简单看一下这个方法的系统解释:

也就是说这个方法只是暂时将AVAudioSessionCategoryPlayAndRecord category情况下, 将音频输出强制输出到AVAudioSessionPortOverrideSpeaker扬声器, 在使用完以后, 再设置回AVAudioSessionPortOverrideNone.

如果需要永久将PlayAndRecord Category中, 音频输出到扬声器, 最好的方式是直接设置Options为AVAudioSessionCategoryOptionDefaultToSpeaker.

具体的代码如下:

系统的中断响应分成两类:

默认情况下, AudioSession会在App启动时选择一个最优的输出方案, 比如插入耳机的时候, 就用耳机. 但是这个过程中, 用户可能拔出耳机, 我们App要如何感知这样的情况呢

系统会通过 AVAudioSessionRouteChangeNotification来进行通知其中在其userInfo中有键:AVAudioSessionRouteChangeReasonKey来表示改变的原因,原因的键值有一下几种:

AVAudioSessionRouteChangeReasonUnknown:未知原因

AVAudioSessionRouteChangeReasonNewDeviceAvailable:有新设备可用

在音频SDK中, 针对AVAudioSession都需要指定对应的Category, mode, options等配置.

具体过程如下:

我们可以在SDK使用完音频资源以后通过如下配置停止Category的服务, 这样之前的背景音乐APP声音会继续播放:

在使用 Category = AVAudioSessionCategoryPlayAndRecord 默认会使用听筒播放音乐!

有如下几种情况:

当不接外设时, 此时音频从前置摄像头的听筒输出, 声音会非常小!!!

当仅插入有线耳机时, 此时音频从有线耳机输出!

当仅接入蓝牙耳机时, 未插入有线耳机时, 音频从听筒输出!!!不会从蓝牙耳机输出

当先插入有线耳机, 然后接入蓝牙耳机时(根据apple策略, 声音会优先从蓝牙耳机输出), 此时还是会从有线耳机输出声音!!!不会从蓝牙耳机输出

简单结论 , Category == PlayAndRecord, Options == 0 ==> 音频从听筒输出:

此时, 在没有有线耳机的情况下, 声音太小!!! 体验不好!!! 我们需要增加Options来进行改进

有如下几种情况:

当不接外设时, 此时音频从扬声器输出, 声音很大!!!

当仅插入有线耳机时, 此时音频从有线耳机输出!!!

当仅接入蓝牙耳机时, 未插入有线耳机时, 音频从扬声器输出!!!不会从蓝牙耳机输出

当先插入有线耳机, 然后接入蓝牙耳机时(根据apple策略, 声音会优先从蓝牙耳机输出), 此时还是会从有线耳机输出声音!!!不会从蓝牙耳机输出

简单结论, Category == PlayAndRecord, Options = AVAudioSessionCategoryOptionDefaultToSpeaker ==> 默认音频从扬声器输出:

有如下几种情况:

当不接外设时, 此时音频从听筒输出, 声音会非常小!!!

当仅插入有线耳机时, 此时音频从有线耳机输出!!!

当仅接入蓝牙耳机时, 未插入有线耳机时, 音频此时会从蓝牙耳机输出!!!

当先插入有线耳机, 然后接入蓝牙耳机时(根据apple策略, 声音会优先从蓝牙耳机输出), 此时会从蓝牙耳机输出

简单结论, Category == PlayAndRecord, Options = AVAudioSessionCategoryOptionAllowBluetooth ==> 默认音频从听筒输出:

结论: 如果没有外设, 会从扬声器输出, 如果有外设, 根据Last in Wins 原则从外设(有线耳机, 蓝牙耳机)输出.

直接使用如下关键的是overrideOutputAudioPort API, 而Options是否使用AVAudioSessionCategoryOptionAllowBluetoot|AVAudioSessionCategoryOptionDefaultToSpeaker并不影响:

在设置overrideOutputAudioPort 为Speaker 以后, 不论是否接入外设, 设备会强制使用扬声器作为音频播放目的!!! 因此该方法的优先级非常高!!!

一定要在设置AVAudioSessionPortOverrideSpeaker 以后, 在结束使用时候调用 [[AVAudioSession sharedInstance] overrideOutputAudioPort:0 error:nil]; 将强制从扬声器输出音频改成系统默认(也就是Options)!!! 否则可能导致SDK影响APP的其他服务(一般SDK不会去修改overrideOutputAudioPort!!!)

我们的SDK在使用AVAudioSession时, 建议使用最小权限使用原则, 在即将要使用音频资源时, 去配置AVAudioSession的相关API, 在音频使用结束以后, 关闭!!!

另外如果需要防止其他模块的影响, 建议使用如下代码 ( 如果有特殊需求, 自行更改. 比如要强制要求不论是否拥有外设, 用扬声器输出音频):

在不使用音频逻辑时, 将AVAudioSession关闭:

另外为了更好的音频体验逻辑, 为了充分利用PlayAndRecord的默认输出是听筒, 其他的Category的默认输出是扬声器, 可以使用距离监听器, 去切换音频播放中的一些逻辑, 如下:

THE END
0.「2022年摩托车头盔如何选」新手骑士选装备必看紧急快速摘除系统,能在事故发生后,通过此装置快速拉出头盔面颊内衬,方便去除头盔,从而避免车手的头颈部在传统拆除头盔的过程中出现二次伤害。目前E.Q.R.S.已经是头盔的主流配置。 蓝牙耳机预留孔位 除了赛用头盔外,大部分头盔都为头盔蓝牙耳机预留了耳机槽,方便车友加装耳机单元。 jvzquC41yy}/fxsiejkek7hqo1{he8ftvkimg8<355733=63638::=882
1.在iPhone上设置和使用蓝牙配件配合iPhone 使用蓝牙耳机、扬声器、游戏控制器、键盘等。jvzquC41uwvqq{y0crvmg7hqo1€i/ls1iwoeg8nrjqtf1ruj5e;1h:>313=/28nqu17809
2.专为舒适而生的JEETAir2蓝牙耳机开箱评测原创提起蓝牙耳机,现在市面上的蓝牙耳机款式真的是眼花缭乱,各种类型的蓝牙耳机应运而生,入耳式、半入耳式、还有这几年比较火的骨传导蓝牙耳机。我个人的观点就是,一款好的蓝牙耳机首先它的音质一定要好,不然平时佩戴就没什么动力了。其次,很多朋友选择蓝牙耳机的时候还会考虑到佩戴的舒适性,那么蓝牙耳机的小巧轻便就比较重要了。 最近,有粉丝 jvzquC41|juoilj0uktb0lto0et0c{ykenk0xrjy13768B<1
3.ARM平台上蓝牙协议栈Bluez的移植使用和配置00:13:EF:A0:00:AF GPFILE Morr2 # 这个是我的蓝牙耳机 配置并连接蓝牙设备 我们移植了bluez,就是为了使用是骡子是马拉出来遛遛 但是我们不得不说写题外话,我们必须了解蓝牙的机制,以及蓝牙命令以及配置文件等信息 蓝牙配置文件 蓝牙采用/etc/bluetooth/下的hcid.conf 和 rfcomm.conf 来进行配置。 jvzquC41yy}/gn|qtnj/exr0ep5ne~4ke7:559>a40nuou
4.蓝牙耳机选购什么配件最重要?2021真人避坑五款高颜值蓝牙耳机如今越来越多手机开始取消耳机孔,加上蓝牙耳机的技术越来越成熟,选择蓝牙耳机的用户也越多。那么问题来了,蓝牙耳机怎么挑才是合理的呢?下面小编就给大家介绍一下。 一、便携/续航 蓝牙耳机有分体式和一体式两种区别。其中一体式其芯片单元都集中在颈托或头罩上,在电池续航和信号方面会有优势,代价则是会增大耳机的jvzquC41f{428<3eqo5bt}neng5GWQFXPVY17<6P8RP/j}rn
5.一文读懂:骨传导耳机利弊韶音漏音立体声蓝牙耳机除了以上那些相对主观的数据,下面则是一些客观的耳机配置,列出表格更加方便大家选择。 对于蓝牙和防水方面不了解的话,下面再列出一个参考的表格,对号入座即可。 防水等级参考: 蓝牙版本参考 四、值得推荐的骨传导耳机 南卡runner pro3 价格:1398 一句话点评:国内TOP1骨传导品牌南卡旗舰款式,主打完善体验,想体验最优质jvzquC41yy}/3?80eqs0f‚4ctvodnn4K3T:QRNS2739FHBZ0jvsm
6.ios蓝牙音频协议苹果蓝牙音质传输协议A2DP——Advanced Audio Distribution Profile,音频发送配置协议 而通常在无线蓝牙耳机里面都会使用A2DP协议,是实现蓝牙音频传输的必备协议,其定义了传送单声道或立体声的不同质量音频信息的协议和过程。 其实早在蓝牙连接建立阶段,发射源、接收源在握手通讯定义了音频将会以何种编码形式传输,不同蓝牙音频编码标准会直接jvzquC41dnuh0>6evq4dqv4wa3:23;4;45918:
7.蓝牙音频编码简介本文从蓝牙音频传输原理讲起,从旧到新介绍五种蓝牙音频编码,最后落脚实地,介绍如何选择和配置耳机/手机的蓝牙音频编码,获得更好的音质体验。 1 蓝牙音频传输原理 在《数字音频基础­­­­­-从PCM说起》中,我们知道mp3和flac音频编码都是在PCM音频编码基础上二次编码得到的,其目的是减小文件体积。那么,在jvzquC41yy}/5?5fqe4dp8ftvkimg86677<84@d328=56:7320nuou
8.绿联HiTuneH3蓝牙耳机开箱评测原创在这个人手一部手机的时代,很多人会选择蓝牙耳机来实现听歌,蓝牙耳机也渐渐成为了很多手机用户必备的数码产品之一了。随着蓝牙耳机越来越受手机用户的喜爱,市面上也涌现出了很多品牌的蓝牙耳机,种类繁多、价格也是千差万别,上至几千元、低至几十元也有。对于很多手机用户来说,选择蓝牙耳机也是一件比较头疼的事。 jvzquC41|juoilj0uktb0lto0et0c{ykenk0xrjy13764;=1
9.哪款蓝牙耳机适合运动佩戴?四款高配置蓝牙耳机盘点降噪耳机蓝牙本文推荐了几款配置出色的蓝牙耳机,包括南卡A2、OPPO Enco X、漫步者HECATE GX07和铁三角ANC300TW。南卡A2以其卓越的降噪效果和音质受到好评,OPPO Enco X设计独特,音质出色,漫步者HECATE GX07专为电竞设计,低延迟,而铁三角ANC300TW则保持了品牌的高音质标准,适合音乐爱好者。 jvzquC41dnuh0lxfp0tfv8okpvgo;A;1ctzjeuj1fgzbkux134965:967
10.开放式耳机应该如何挑选,好用的开放式耳机大推荐●耳机基础配置: 不同于同价位其他开放式耳机会出现连接不稳定、延迟高等问题,西圣Olite支持蓝牙5.3芯片,连接更快更稳定,同时支持60ms赛事级低延时,能做到音画同步,玩游戏也一样畅快淋漓。而且耳机还具备54H超长时间续航,售价才一百多,真的吊打市面上的千元开放式耳机。 jvzquC41dnuh0lxfp0tfv8p455943:4ctvodnn4fgvgjn|43587:2A5: