iOS AVAudioSession、AudioSession Category选择和声音通道听筒、扬声器切换

2023-05-16

原文

选择一个Category

pragma mark – Values for the category property –

/*  Use this category for background sounds such as rain, car engine noise, etc.  

 Mixes with other music. */

AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;

/*  Use this category for background sounds.  Other music will stop playing. */

AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;


/* Use this category for music tracks.*/

AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;


/*  Use this category when recording audio. */

AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;


/*  Use this category when recording and playing back audio. */

AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;


/*  Use this category when using a hardware codec or signal processor while

 not playing or recording audio. */

AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing;


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下声音的默认出口为听筒(在没有外接设备的情况下)。


注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。

设置Category

NSError *setCategoryError = nil;  

BOOL success = [[AVAudioSession sharedInstance]  

                setCategory: AVAudioSessionCategoryAmbient  

                error: &setCategoryError];  

  

if (!success) { /* handle the error in setCategoryError */ }  

 

Activate & Deactivate AudioSession

 

NSError *error = nil;  

AVAudioSession *audioSession = [AVAudioSession sharedInstance];  

BOOL ret = [audioSession setActive:YES error:&error];  

if (!ret)  

{  

    NSLog(@”%s - activate audio session failed with error %@”, __func__,[error description]);  

}  

NSError *error = nil;  

AVAudioSession *audioSession = [AVAudioSession sharedInstance];  

//Note: Set AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation to resume other apps’ audio.  

BOOL ret = [audioSession setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];  

if (!ret)  

{  

}  

 

Audio Route的选择

当你的iPhone接有多个外接音频设备时(耳塞,蓝牙耳机等),AudioSession将遵循last-in wins的原则来选择外接设备,即声音将被导向最后接入的设备。

当没有接入任何音频设备时,一般情况下声音会默认从扬声器出来,但有一个例外的情况:在PlayAndRecord这个category下,听筒会成为默认的输出设备。如果你想要改变这个行为,可以提供MPVolumeView来让用户切换到扬声器,也可通过overrideOutputAudioPort方法来programmingly切换到扬声器,也可以修改category option为AVAudioSessionCategoryOptionDefaultToSpeaker。

 

PlayandRecord下切换到扬声器

除了让用户手动选择,你也可以通过以下两种方法在程序里进行切换

1. 修改Category的默认行为:

 

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];  

2. OverrideOutputAudioPort:

 

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 

这两种方法的区别官方文档中有详细的说明


在iOS7.0之前可用下面方法重定向(属于AudioSession)

audio route属性有以下两个,一个是默认的听筒,另一个则是扬声器。

 

  1. enum {    
  2.    kAudioSessionOverrideAudioRoute_None    = 0,  
  3.    kAudioSessionOverrideAudioRoute_Speaker = ‘spkr’  
  4. };  

  1. UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;  
  2.       
  3.     AudioSessionSetProperty (  
  4.                              kAudioSessionProperty_OverrideAudioRoute  
  5.                              sizeof (audioRouteOverride),  
  6.                              &audioRouteOverride  
  7.                              );  

  

  1. UInt32 doChangeDefaultRoute = 1;  
  2.       
  3.     AudioSessionSetProperty (  
  4.                              kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,  
  5.                              sizeof (doChangeDefaultRoute),  
  6.                              &doChangeDefaultRoute  
  7.                              );  

google翻译:
技术问答QA1754
AVAudioSession - AVAudioSessionPortOverrideSpeaker和AVAudioSessionCategoryOptionDefaultToSpeaker之间的差异

问:你能否解释一下调用AVAudioSession方法之间的差异overrideOutputAudioPort:与价值AVAudioSessionPortOverrideSpeaker,并使用类别选项AVAudioSessionCategoryOptionDefaultToSpeaker用setCategory:withOptions:error:。

A:区别在于,AVAudioSessionPortOverride通过调用设置overrideOutputAudioPort:比使用category选项更加短暂AVAudioSessionCategoryOptionDefaultToSpeaker。

重要: 两者的使用AVAudioSessionPortOverrideSpeaker和AVAudioSessionCategoryOptionDefaultToSpeaker仅适用于AVAudioSessionCategoryPlayAndRecord类别。
调用overrideOutputAudioPort:和设置AVAudioSessionPortOverrideto AVAudioSessionPortOverrideSpeaker是临时覆盖要播放到扬声器的输出的一种方式。任何路由改变或中断将导致音频被路由回到其正常路由,遵循最后入胜的规则。想想使用overrideOutputAudioPort:什么可以用来实现一个扬声器电话按钮,你想要能够在扬声器(AVAudioSessionPortOverrideSpeaker)和正常的输出路由(AVAudioSessionPortOverrideNone)之间切换。

注意: 此属性旨在允许第三方应用程序模拟扬声器按钮的行为,因此可能更改输入路由以及输出路由。例如,将耳机插入时将设置AVAudioSessionPortOverride为AVAudioSessionPortOverrideSpeaker,将使路由更改为内置麦克风/内置扬声器。
实现免提功能的首选方法是使用MPVolumeView“路由”按钮。

相反,AVAudioSessionCategoryOptionDefaultToSpeaker修改AVAudioSessionCategoryPlayAndRecord类别的路由行为,使得如果没有诸如耳机的其它附件在使用中,则音频将总是路由到扬声器而不是接收器。

使用AVAudioSessionCategoryOptionDefaultToSpeaker时,用户手势将被授予。例如,插入耳机将导致路由更改为耳机麦克风/耳机,拔下耳机将导致路由更改为内置麦克风/扬声器(与内置麦克风/接收器相反),当此覆盖具有已设置。

在使用USB输入专用附件的情况下,音频输入将来自附件,并且如果耳机未插入,则输出将路由到耳机(如果附接)或扬声器。用例仅是将音频路由到扬声器而不是在音频通常去往接收器的情况下。此选项是类别的修饰符。

路线更改和中断不会重置此覆盖。只有更改AVAudioSession类别将导致此选项被重置

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS AVAudioSession、AudioSession Category选择和声音通道听筒、扬声器切换 的相关文章

  • 如何判断蓝牙设备类型

    我们在开发Android的蓝牙应用时 xff0c 可能需要知道扫描到的蓝牙设备是什么类型 xff0c 然后过滤掉不符合要求的设备 xff0c 只保留符合要求的设备 xff0c 例如我们在车载系统上开发蓝牙电话应用时 xff0c 我们希望只显
  • Aspose.Words for Java 体验

    公司中要做一些导出word的工作 xff0c 经别人推荐 xff0c 使用了Aspose Words for Java xff0c 感觉很好用 xff0c 美中不足的地方就是 xff0c 它是收费软件 原理吗 xff1f 比较常规 xff0
  • 汽车制造行业OEM Tier1 Tier2指代什么?

    OEM OEM是Original Equipment Manufacturer的缩写 xff0c 通常指设备厂商 主机厂 整车厂 例如 xff1a 宝马 奔驰 奥迪 大众 丰田 国内汽车主机厂排名前十分别是上汽集团 东风汽车 北京汽车 长安
  • Android应用系统签名方法

    1 应用配置sharedUserId 在AndroidManifest xml文件根节点中加入属性 xff1a android sharedUserId 61 34 android uid system 34 2 找到系统签名文件 plat
  • Android 读取CPU/GPU运行参数(MTK平台)

    一 使用场景 Android运行一段世时间后 xff0c 系统出现卡顿 二 分析 amp 定位问题 系统卡顿 xff0c 同时又发现芯片温度很高 xff0c 怀疑是温度过高导致CPU降频 xff0c 因此我们要将一段时间内CPU的运行信息打
  • Android签名 (二) 制作签名文件

    你可能想知道 通过这篇博客可以解决哪些问题以及学到什么 xff1a 1 公司开发一个新的app xff0c 如何创建一个应用签名 xff1f 2 为了安全性 xff0c Android系统不想使用Google给的原生签名 xff0c 如何定
  • Android签名 (一) 查看签名信息

    你可能想知道 通过这篇博客可以解决哪些问题以及学到什么 xff1a 1 如果我们有一个应用 xff0c 如何查看应用的签名信息 xff1f 2 如果我们有签名原始文件 xff0c 如何查看签名文件中的签名信息 xff1f 这篇博客介绍了如何
  • L8 U3 职业生涯

    Module 1 谈论你最近的工作 1 描述工作 描述工作的形容词 让我们来看一下可以用来描述工作 xff0c 项目和客户的形容词 用enjoyable 和 engaging来描述你觉得有意思的工作或者项目 For me sales is
  • L8 U4 商务旅行

    Module 1 计划商务旅行 1 处理信息 You mean with Lindstrom 你是说和林特罗姆 xff1f Yes with Lindstrom 是的 xff0c 和林特罗姆 Exactly 完全正确 You mean yo
  • L8 U5 产品和创新

    Module 1 产品特点 1 产品特点 询问产品特性 在询问商店中的产品时 xff0c 您可能首先想询问其质量水平 top of the range 高档的middle of the range 中档的good value for mon
  • Android打包jar的两种方法

    方法一 xff1a 使用Android Studio打包 方法二 xff1a 使用Android Build System打包 一 Android Studio打包 1 新建Android Library xff0c 取名为opensdk
  • LCS 下载插件

    难度简单2收藏分享切换为英文接收动态反馈 小扣打算给自己的 VS code 安装使用插件 xff0c 初始状态下带宽每分钟可以完成 1 个插件的下载 假定每分钟选择以下两种策略之一 使用当前带宽下载插件将带宽加倍 xff08 下载插件数量随
  • 调用webservice异常总结

    发布和调用Webservice很简单 xff0c 但小问题依然不断 xff0c 特总结如下 xff1a 一 Java调用 net的webService产生 服务器未能识别 HTTP 标头 SOAPAction 的值 错误 解决方案 xff1
  • 去除Evaluation Warning : The document was created with Spire.PDF for Java.

    去除Evaluation Warning The document was created with Spire PDF for Java 最近项目中有一个需求需要把PDF文件添加页码 xff0c 最终在网上找到了用Spire去添加的方法
  • 第二章 简单网页的爬取与Xpath、Json使用 2021-09-09

    爬虫系列总目录 本章节介绍爬虫中使用的基础库用于选择 xff0c 过滤页面信息 包括requests xff0c bs4 xff0c xpath xff0c 正则表达式re xff0c json 等内容 xff0c 能够实现对简单页面的获取
  • 解决crontab定时任务多次执行

    今天使用linux crontab定时任务时 xff0c 可能由于配置不妥 xff0c 任务多执行一次 xff0c 如下是我程序的日志记录 xff08 执行了两次 xff0c 我设置的是每分钟执行1次 xff09 解决如下 重启cronta
  • ruoyi对接CAS统一身份认证

    暂定逻辑如下 xff1a 搭建CAS服务器端 xff1a 项目地址 xff1a https gitee com weigang wu cas server webapp git 项目里有二开的说明文档 xff0c 如 xff1a 按照自定义
  • Linux 系统启动过程

    简介 Linux 系统启动过程大致分为5个阶段 xff1a 1 内核的引导 2 运行 init 3 系统初始化 4 建立终端 5 用户登录系统 内核引导 计算机通电后 xff0c 首先会进行 BIOS 开机自检 xff0c 然后根据BIOS
  • Ubuntu 修改$PS1 自定义命令提示符

    文章更新于 xff1a 2020 03 25 文章目录 一 自定义命令提示符1 可修改的是那部分 xff1f 2 修改 PS1 变量3 PS1 变量格式4 如何修改背景颜色5 修改字体 二 Enjoy xff01 一 自定义命令提示符 1
  • C#byte类型

    byte类型的范围是0 255 转换为二进制是00000000 11111111 C 中对byte类型的处理还是很特殊的 下面用几行简单的代码来说明问题 byte x 61 1 byte y 61 2 byte z 61 x 43 y er

随机推荐