swift 技术 音频

news2024/11/24 13:04:14

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

浅红色文字:

代码如下(示例):

提示:这里对文章进行总结:

前言

音频输出作为硬件资源,对于iOS系统来说是唯一的,需要通过“AVAudioSession”这个系统级全局对象对各个App进行控制

正题

在这里插入图片描述

常见音频场景:

1.是进行录音还是播放?
2.当系统静音键按下时该如何表现?
3.是从扬声器还是从听筒里面播放声音?
4.插拔耳机后如何表现?
5.来电话/闹钟响了后如何表现?
6.其他音频App启动后如何表现?

通过“AVAudioSession”可以做什么操作:

1.为app选择输入输出的路由:通过扬声器或者听筒播放–可以手动设置通过手机上扬声器/听筒或者耳机播放–系统自动切换,插入耳机默认耳机
2.为app选择输入的路由:通过手机麦克风或者耳机麦克风采集-系统自动切换,插入耳机默认耳机
3.协调音频播放的app之间的关联,以及系统的声音处理
4.处理被其他app打断后的情况
5.录音或者播放音乐

AVAudioSession默认行为:

1.可以进行播放,但是不能进行录制。
2.当用户将手机上的静音拨片拨到“静音”状态时,此时如果正在播放音频,那么播放内容会被静音。
3.当用户按了手机的锁屏键或者手机自动锁屏了,此时如果正在播放音频,那么播放会静音并被暂停。
4.如果你的App在开始播放的时候,此时QQ音乐或其他App正在播放,那么其他播放器会被静音并暂停。
5.系统会在app启动的时候,激活这个全局唯一的AVAudioSession

音频模式七大场景:

该场景由7个类别分别控制:

默认是:CategorySoloAmbient

AVAudioSessionCategoryAmbient(独占播放) :
只用于播放音乐时,并且可以和QQ音乐同时播放,比如玩游戏的时候还想听QQ音乐的歌,那么把游戏播放背景音就设置成这种类别。同时,当用户锁屏或者静音时也会随着静音,这种类别基本适用所有App的背景场景。

AVAudioSessionCategorySoloAmbient:
也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是,用了它就别想听QQ音乐了,比如不希望QQ音乐干扰的App,类似节奏大师。同样当用户锁屏或者静音时也会随着静音,锁屏了就玩不了节奏大师了。

AVAudioSessionCategoryPlayback:
如果锁屏了还想听声音怎么办?用这个类别,比如App本身就是播放器,同时当App播放时,其他类似QQ音乐就不能播放了。所以这种类别一般用于播放器类App

AVAudioSessionCategoryRecord:
有了播放器,肯定要录音机,比如微信语音的录制,就要用到这个类别,既然要安静的录音,肯定不希望有QQ音乐了,所以其他播放声音会中断。想想微信语音的场景,就知道什么时候用他了。

AVAudioSessionCategoryPlayAndRecord:
如果既想播放又想录制该用什么模式呢?比如VoIP,打电话这种场景,PlayAndRecord就是专门为这样的场景设计的 。

AVAudioSessionCategoryMultiRoute:
想象一个DJ用的App,手机连着HDMI到扬声器播放当前的音乐,然后耳机里面播放下一曲,这种常人不理解的场景,这个类别可以支持多个设备输入输出。

AVAudioSessionCategoryAudioProcessing:
主要用于音频格式处理,一般可以配合AudioUnit进行使用

上面介绍的七大类别,可以认为是设定了七种主场景,而这七类肯定是不能满足开发者所有的需求的。AVAudioSession提供的方法是,首先定下7种类别中的一种基调,再进行微调。AVAudioSession为每种Category都提供了些许选项来进行微调。

类别的选项:

AVAudioSessionCategoryOptionMixWithOthers :
如果确实用的AVAudioSessionCategoryPlayback实现的一个背景音,但是又想和QQ音乐并存,可以在AVAudioSessionCategoryPlayback类别下在设置这个选项,就可以实现共了。

AVAudioSessionCategoryOptionDuckOthers :
:在实时通话的场景,比如QQ音乐,当进行视频通话的时候,会发现QQ音乐自动声音降低了,此时就是通过设置这个选项来对其他音乐App进行了压制。

AVAudioSessionCategoryOptionAllowBluetooth :
如果要支持蓝牙耳机电话,则需要设置这个选项

AVAudioSessionCategoryOptionDefaultToSpeaker :
如果在VoIP模式下,希望默认打开免提功能,需要设置这个选项

七大模式:

AVAudioSessionModeDefault:
每种类别默认的就是这个模式。

AVAudioSessionModeVoiceChat:
主要用于VoIP场景,此时系统会选择最佳的输入设备,比如插上耳机就使用耳机上的麦克风进行采集。同时会设置类别的选项为"AVAudioSessionCategoryOptionAllowBluetooth"从而支持蓝牙耳机。

AVAudioSessionModeVideoChat:
主要用于视频通话,比如QQ视频、FaceTime。系统会选择最佳的输入设备,比如插上耳机就使用耳机上的麦克风进行采集并且会设置类别的选项为"AVAudioSessionCategoryOptionAllowBluetooth" 和 “AVAudioSessionCategoryOptionDefaultToSpeaker”。

AVAudioSessionModeGameChat:
适用于游戏App的采集和播放,比如“GKVoiceChat”对象,一般不需要手动设置

每个模式有其适用的类别,可以根据具体需要做对应的组合。

音频通知

系统中断通知

如果app正在视频通话,突然来电话了、闹钟响了等,最常用的场景是先暂停,待恢复的时候再继续。app可以通过监听系统消息:AVAudioSessionInterruptionNotification 来处理。系统消息userInfo主要包含两个键:

AVAudioSessionInterruptionTypeKey: 取值为AVAudioSessionInterruptionTypeBegan表示中断开始,我们应该暂停播放和采集,取值为AVAudioSessionInterruptionTypeEnded表示中断结束,我们可以继续播放和采集。

AVAudioSessionInterruptionOptionKey: 当前只有一种值AVAudioSessionInterruptionOptionShouldResume表示此时也应该恢复继续播放和采集。

其他app占用通知

其他App占据AudioSession的时候用AVAudioSessionSilenceSecondaryAudioHintNotification 来进行通知。其回调回来的userInfo键为:AVAudioSessionSilenceSecondaryAudioHintTypeKey

AVAudioSessionSilenceSecondaryAudioHintTypeBegin:表示其他App开始占据Session

AVAudioSessionSilenceSecondaryAudioHintTypeEnd:表示其他App开始释放Session

外设改变通知

默认情况下,AVAudioSession会在App启动时选择一个最优的输出方案,比如插入耳机的时候,就用耳机。但是这个过程中,用户可能拔出耳机,app可以通过监听系统消息:AVAudioSessionRouteChangeNotification 来处理。

针对视频通话场景设置

类别:AVAudioSessionCategoryPlayAndRecord类别的选项:AVAudioSessionCategoryOptionAllowBluetoothAVAudioSessionCategoryOptionDefaultToSpeaker模式:AVAudioSessionModeVideoChat

如果想做录制一段音频,然后进行播放的操作。

建议录音修改为:(也就是支持录音的模式)
在这里插入图片描述

建议播放修改为:(也就是只播放的模式)。经过我的测试,播放时使用AVAudioSessionCategoryPlayAndRecord(录音播放模式),会导致播放声音很小。

AVAudioSessionCategorySoloAmbient 或 AVAudioSessionCategoryAmbient 或AVAudioSessionCategoryPlayback
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【测试开发】单元测试、基准测试和性能分析(以 Go testing 为例)

一、为什么需要测试🤔️ 你写不出 bug-free 的代码。你认为自己写出了 bug-free 的代码,但它在你意想不到的地方出错了。你觉得自己写出了永不出错的代码,但它的性能十分糟糕。 二、在开发过程中做好测试(理想情况下)…

PLC模糊PID模糊规则矩阵(梯形图语言实现)

博途PLC的模糊PID控制详细内容请查看下面的博客文章: Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_RXXW_Dor的博客-CSDN博客模糊PID的其它相关数学基础,理论知识大家可以参看专栏的其它文章,这里不再赘述,本文就双容…

mysql实现存在则保存,不存在则更新

方式1 ON DUPLICATE KEY UPDATE 使用前提:表必须配置唯一键或者主键,且保存的字段中包含该键【重点】 原理: ON DUPLICATE KEY UPDATE如果配合主键,存在数据a,新插入b,如果主键不冲突,会保存b…

[React] useRef用法和特性

useRef 与 useState 的区别 一般在使用react-hook的时候&#xff0c;我们用到最多的就是定义变量&#xff0c;以及对应的修改变量 下面是一个最基本的 react-hook 应用程序 const Home () > {const [username, setUserName] useState();return &#xff08;<input va…

【物联网】物1— 初步认识MQTT、连接到MQTT服务端

目录 一、MQTT是什么 二、MQTT的版本 两者之间的关系&#xff1a; ​三、MQTT工作的基本原理 3.1、概念 MQTT客户端&#xff1a; MQTT服务端&#xff1a; MQTT主题&#xff1a; 3.2、MQTT订阅/发布主题的特点 相互可独立性&#xff1a; 空间可分离&#xff1a; 时间…

创建第一个DJango3的后端项目

1.安装DJango 需要事先安装python 打开控制台,使用pip命令安装django pip install django如何检验安装成功&#xff1a;在命令行中进入python的环境&#xff0c;导入并打印django的版本信息 2.使用django创建第一个项目 在命令行中进入要存放项目的位置&#xff0c;输入dj…

【mysql】日常遇到的问题解决

目录 MySQL 删除数据库报错 1010 - Error dropping database (cant rmdir) [ERR] 1452 - Cannot add or update a child row: a foreign key constraint fails MySQL 删除数据库报错 1010 - Error dropping database (cant rmdir) 场景复现&#xff1a;navicat中&#xff0c…

Java集合 —— HashMap

一、HashMap是什么 HashMap是一个存储key-value键值对的哈希表&#xff0c;表中每个元素的key都是唯一的&#xff08;通过equals方法判断&#xff09;&#xff0c;查询时通过key的hashcode值即可定位到元素的存储地址&#xff0c;因此HashMap在理想情况下查询时间复杂度为O(1)…

简单谈谈OLTP,OLAP和列存储的概念

简单谈谈OLTP,OLAP和列存储的概念 OLTP(online transaction processing)OLAP(online analytic processing)OLTP VS OLAP数据仓库OLTP数据库和数据仓库之间的差异星型和雪花分析模式列式存储列压缩列式存储和列族内存带宽与矢量化处理列式存储中的排序顺序几个不同的排序顺序 写…

换个花样玩C++(4)细聊C++的引用精妙之处

引用是C++引入的新语言特性。而且在日常工作开发过程中,经常会使用到引用,对于一些做系统架构的架构师而言,这也是不可或缺的一门基本功,我在工作中发现,很多人并没有搞清楚引用。因此我在本篇中将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。…

你的mysql到底能存多少数据呢?

前言 参考借鉴文章 我说MySQL每张表最好不超过2000万数据&#xff0c;面试官让我回去等通知&#xff1f; 这里自己在总结一下&#xff0c;原因是相关知识欠缺&#xff0c;看别人的文章研究很久才弄明白&#xff0c;所以这里记录一些心得。 作者&#xff1a;阿杆 链接&#xff…

4月28号软件资讯更新合集.....

快速接活&#x1f496;Snowy v2.2.8 已更新 Snowy&#xff08;SnowyAdmin&#xff09;是国内首个国密前后端分离快速开发平台&#xff0c;集成国密加解密插件&#xff0c; 使用 AntdvVite3SpringBootMybatisPlusHutoolSaToken 技术栈开发&#xff0c;软件层面符合等保测评要求…

PPPwizard1.4.3软件使用说明中文翻译稿

PPP软件包使用说明(版本1.4.3) 1. 交付包 PPPWizardxy内容是按照以下模式组成&#xff1a; PPPWizardxy |-- PPPSoftwarePackage_v1.4.3.pdf |-- RTRover |-- compile.sh |-- generateLowLevel.cpp |-- getStream.cpp |-- laurichesse_ion_gnss_2015_september_bdp.pdf |-- …

JVM内存模型的演变

1&#xff0c;背景 class文件、类的加载过程。我们的class文件就要进入到JVM内存里&#xff0c;我们沿着经典的JDK1.6&#xff0c;JDK1.7&#xff0c;JDK1.8看看在其中都经历了哪些改变 概念的统一&#xff1a; 方法区&#xff1a; 方法区可以看作是JVM逻辑上管理一片区域的…

深度学习-第T5周——运动鞋品牌识别

深度学习-第T5周——运动鞋品牌识别 深度学习-第T5周——运动鞋品牌识别一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目3、查看数据 四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签 2、数据可视化3、检查数据4、配置数据集 …

微短剧“小阳春”,“爱优腾芒”抢滩登陆?

降本增效一整年&#xff0c;长视频平台们似乎扭转了市场对于它们“烧钱”的印象。 爱奇艺宣布2022全年盈利&#xff0c;腾讯视频宣布从去年10月起开始盈利&#xff0c;视频平台们结束了一场“无限战争”。 与此同时&#xff0c;随着短视频平台的崛起&#xff0c;视频内容的形…

从0到1带你构建——低代码开发入门案例

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端&#xff08;Node.js&#xff09; &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;…

【算法】欧拉路径的DFS存储顺序

欧拉路径和欧拉回路 对于无向图&#xff0c;所有边都是连通的。 &#xff08;1&#xff09;存在欧拉路径的充分必要条件&#xff1a;度数为奇数的点只能有0个或2个。 &#xff08;2&#xff09;存在欧拉回路的充分必要条件&#xff1a;度数为奇数的点只能有0个。 对于有向图&a…

jvm之字节码

写在前面 java字节码由单字节的指令(也叫做操作码)组成&#xff0c;但一个 byte 最多能够存储 256 个指令&#xff0c;够用吗&#xff1f;截止到目前是够的&#xff0c;因为指令的个数是200多一点&#xff0c;指令分为如下四类&#xff1a; 1&#xff1a;栈操作指令&#xff…

【前端基础知识】Vue中的变量不是响应式的吗?属性赋值后视图不变化的原因是什么?

目录 &#x1f914;问题&#x1f4dd;回答&#x1f3a8;使用场景动态添加属性动态添加数组元素 ❌注意事项$set只能在响应式对象上使用$set不能用于根级别的属性$set的性能问题 &#x1f4c4;总结 &#x1f914;问题 Vue是一款在国内非常流行的框架&#xff0c;采用MVVM架构&a…