iOS AVAudioSession 详解【音乐播放器的配置】

前言

在 iOS 音频开发中,AVAudioSession 是至关重要的工具,它控制着应用的音频行为,包括播放、录音、后台支持和音频中断处理等。对于音乐播放器等音频需求强烈的应用,设计一个合理的 AVAudioSession 管理体系不仅能保证音频播放的流畅体验,也能确保应用在多种使用场景下的稳定性。本文将基于苹果官方文档,详细介绍如何使用 AVAudioSession,并探讨在音乐播放器设计中如何合理管理 AVAudioSession。

请添加图片描述

一、AVAudioSession 的基础概念

AVAudioSession 提供了一个全局的音频会话来管理应用的音频需求。音频会话分为多个类别(category)和模式(mode),并支持多种选项(options)以适应不同场景。每个类别有其特定的行为和适用场景,例如是否支持后台播放,是否允许耳机和蓝牙播放等。音频会话配置完成后,通过激活音频会话来使配置生效。

主要概念:
1. 类别 (Category):定义了应用的音频行为,决定了应用如何与系统中的其他音频(如电话或音乐)交互
官方文档:avaudiosession/category

常用类别:
• .playback
用于媒体播放,确保在静音模式下音频仍然可以播放。
• .record
专注于音频输入,如语音录制。
• .playAndRecord
允许同时播放和录音,适用于视频通话等场景。
• .ambient
适合背景音频,音频会在其他音频播放或静音模式下暂停。
• .soloAmbient
类似于 .ambient,但会在其他音频播放时自动静音。
• .multiRoute
支持同时向多个输出设备播放音频,如耳机和扬声器。

2. 模式 (Mode):定义了音频会话的具体操作模式,影响音频处理的特定方式。通过选择适当的模式,开发者可以优化应用的音频行为,以适应不同的使用场景。
官方文档:avaudiosession/mode

常用模式:
• .default
默认模式,适用于大多数音频任务。
• .voiceChat
适合语音聊天,优化语音输入和输出质量。
• .videoRecording
针对视频录制,优化视频和音频的同步。
• .measurement
适合音频测量应用,确保最低延迟和最佳质量。
• .gameChat
优化游戏内语音聊天,确保低延迟和高质量。

3. 选项 (Options):用于进一步细化和调整音频会话类别的行为,通过组合不同的选项,可以实现特定的音频需求。
官方文档:avaudiosession/categoryoptions

常用选项:
• mixWithOthers
允许与其他音频会话混合播放音频,适用于需要与其他音频同时播放的场景。
• duckOthers
在播放音频时,降低其他正在播放的音频的音量。
• allowBluetooth
允许使用蓝牙音频设备进行音频输入和输出。
• defaultToSpeaker
默认将音频路由到扬声器,而不是耳机。

二、AVAudioSession 不同场景的配置表

场景类别 (Category)模式 (Mode)选项 (Options)说明
音乐播放器.playback.default默认: 空
特殊: .mixWithOthers,允许与其他音频混合播放
在播放音乐时,默认情况下不需要特殊配置。特殊情况需要支持和与其他音频同时播放。
语音通话.playAndRecord.voiceChat默认: 空
特殊: .allowBluetooth,支持蓝牙通话
.defaultToSpeaker,通话时默认使用扬声器
通话场景一般无需特殊配置,但如果使用蓝牙设备或希望通话时自动切换到扬声器,则需要这些选项。
视频播放.playback.video默认: 空
特殊: .allowAirPlay,支持 AirPlay 输出
播放视频时一般不需特殊配置。若需要通过 AirPlay 播放视频,可以使用此选项。
语音识别.playAndRecord.measurement默认: 空
特殊: .defaultToSpeaker,默认使用扬声器
语音识别通常不需额外选项,但若需要确保输出清晰,可设置为使用扬声器。
游戏音效.ambient.default默认: 空
特殊: .mixWithOthers,允许与其他音频混合
.duckOthers,降低其他音频音量
游戏场景通常允许与其他音频混合。若需要强调游戏音效,可选择降低其他音频音量。
音频录制.playAndRecord.default默认: 空
特殊: .defaultToSpeaker,录制时输出使用扬声器
录制场景一般不需特殊配置,但若希望使用扬声器输出录制音频可设置此选项。
播放有声书.playback.spokenAudio默认: 空
特殊: .allowBluetooth,允许蓝牙音频输出
播放有声书时一般不需要特殊配置,若希望支持蓝牙播放则需此选项。
后台播放.playback.default默认: 空
特殊: .mixWithOthers,允许与其他音频混合
在应用后台播放音乐时,一般需要设置此选项以确保音乐继续播放。
语音导航.playAndRecord.voicePrompt默认: 空
特殊: .defaultToSpeaker,默认使用扬声器
.allowBluetooth,支持蓝牙音频输出
导航应用通常使用扬声器播放语音提示,若希望支持蓝牙设备则需额外配置。
录音与播放.playAndRecord.default默认: 空
特殊: .mixWithOthers,允许与其他音频混合
.allowBluetooth,支持蓝牙
在同时录音和播放音频时,需根据需求配置选项,以确保音频效果良好。
网络广播.playback.default默认: 空
特殊: .allowAirPlay,支持 AirPlay 输出
.mixWithOthers,允许与其他音频混合
在进行网络广播时,允许与其他音频混合播放,并支持 AirPlay 输出以保证流畅性。
声音提示.ambient.default默认: 空
特殊: .mixWithOthers,允许与其他音频混合
播放短声音提示时,通常不需要特殊配置,若希望同时播放与其他音频,则需此选项。

说明

  • 默认情况: 在没有特殊需求的情况下,Options 一般为空。
  • 特殊情况 根据应用场景的具体需求,选择适合的 Options 选项可以提升用户体验。例如,如果应用需要支持蓝牙音频或在后台持续播放,需明确配置相关选项。

正确配置 AVAudioSession 的类别、模式和选项对于提升音频播放和录制体验至关重要。根据应用场景灵活调整这些设置可以确保音频质量和用户体验。

三、音乐播放器中的 AVAudioSession 配置

在音乐播放器的设计中,我们需要支持后台播放、音频中断处理等。接下来我们将逐步设计 AVAudioSession 的配置和管理方法。

  1. 配置 AVAudioSession 的类别和选项
    音乐播放器的核心需求是播放音频,并支持在应用进入后台时继续播放。因此,我们可以设置音频会话的类别为 .playback。
    一般在播放管理类初始化时,配置一次就可以了
   //配置流通道func configureAudioSession() {do {print("AudioSession category is AVAudioSessionCategoryPlayback")try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])} catch let error as NSError {print("Couldn't setup audio session category to Playback \(error.localizedDescription)")}}
  1. 激活和管理音频会话
    你可以在设置类别后的任何时间激活音频会话,但通常最好将此调用推迟到应用程序开始音频播放。延迟调用可以确保您不会过早地中断正在进行的任何其他背景音频。

激活:建议在开始播放时调用

func activateAudioSession() {do {try AVAudioSession.sharedInstance().setActive(true)} catch {print("Failed to activate audio session: \(error)")}
}

停用
停用当前音频会话,并通知其他应用继续播放;
在确定当前应用没有音频播放的情况下调用。

func deactivateAudioSession() {do {try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)} catch {print("Failed to deactivate audio session: \(error)")}
}
  1. 音频中断处理
    音频中断(如来电)是音频应用中常见的场景。在音频中断时,AVAudioSession 会发送中断通知,我们需要监听并处理这些通知,暂停当前播放,并在中断结束后恢复播放。
NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil)@objc func handleInterruption(notification: Notification) {guard let userInfo = notification.userInfo,let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,let interruptionType = AVAudioSession.InterruptionType(rawValue: typeValue) else {return}switch interruptionType {case .began:// 中断开始,暂停播放pauseMusic()case .ended:if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)if options.contains(.shouldResume) {resumeMusic()}}default:break}
}
  1. 判断是否有其它应用在播放
    secondaryAudioShouldBeSilencedHint:一个布尔值,表示另一个具有不可混合音频会话的应用程序是否正在播放音频
if AVAudioSession.sharedInstance().secondaryAudioShouldBeSilencedHint {print("有更高优先级的音频正在播放,静音当前音频")
} else {// 正常播放音频print("无其他高优先级音频,可以正常播放音频")
}

isOtherAudioPlaying:表示另一个应用程序是否正在播放音频的布尔值

if AVAudioSession.sharedInstance().isOtherAudioPlaying {print("检测到其他音频在播放")// 可选择使用 .mixWithOthers 选项进行混合播放
} else {print("没有其他音频在播放,可以独占播放")// 开始正常播放
}

总结

在音乐播放器中,AVAudioSession 是确保音频会话稳定和高效管理的关键。通过合理设置音频会话的类别和模式,结合锁屏信息展示和远程控制,我们可以提供流畅、贴心的用户体验。同时,注意音频中断处理和远程控制的配置,将让应用的音频体验更加完善和专业。

参考官方文档
documentation/avfaudio/avaudiosession


感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三周精通FastAPI:16 Handling Errors处理错误

官网文档:https://fastapi.tiangolo.com/zh/tutorial/handling-errors 处理错误 某些情况下,需要向客户端返回错误提示。 这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。 需要向客户端返回错误提示的场景主要如下: 客户端…

FastAPI、langchain搭建chatbot,langgraph实现历史记录

环境:openEuler、python 3.11.6、Azure openAi、langchain 0.3.3、langgraph 0.2.38 背景:基于FastAPI、langchain实现一个QA系统,要求实现历史记录以及存储特征信息 时间:20241022 说明:在历史记录的存储中&…

R语言机器学习算法实战系列(十四): CatBoost分类算法+SHAP值 (categorical data gradient boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍CatBoost的原理CatBoost的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割设置数据对象调节参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC Curv…

mysql 通过GROUP BY 聚合并且拼接去重另个字段

我的需求: 我想知道同一个手机号出现几次,并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…

【自然语言处理】BERT模型

BERT:Bidirectional Encoder Representations from Transformers BERT 是 Google 于 2018 年提出的 自然语言处理(NLP)模型,它基于 Transformer 架构的 Encoder 部分。BERT 的出现极大提升了 NLP 任务的性能,如问答系…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

自动化部署-02-jenkins部署微服务

文章目录 前言一、配置SSH-KEY1.1 操作jenkins所在服务器1.2 操作github1.3 验证 二、服务器安装git三、jenkins页面安装maven四、页面配置自动化任务4.1 新建任务4.2 选择4.3 配置参数4.4 配置脚本 五、执行任务5.1 点击执行按钮5.2 填写参数5.3 查看日志 六、查看服务器文件七…

51单片机STC8G串口Uart配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口&#xff1b;本文以串口1为例&#xff0c;串口1有4种工作方式…

java疫苗发布和接种预约系统源码(springboot)

项目简介 疫苗发布和接种预约系统实现了以下功能&#xff1a; 疫苗发布和接种预约系统的主要使用者分为&#xff1a; 管理员对公告信息&#xff0c;医院信息&#xff0c;疫苗信息&#xff0c;医生信息&#xff0c;用户信息&#xff0c;论坛帖子信息以及预约接种信息等信息进行…

C语言程序设计:现代设计方法习题笔记《chapter5》下篇

第七题 题目分析&#xff1a;求最大最小值转换为条件判断问题&#xff0c;最大值有四种可能&#xff0c;最小值相应有三种情况&#xff0c;给出下列代码。 示例代码&#xff1a; #include <stdio.h>int main() {int num1, num2, num3, num4; // 定义四个变量来存储输入…

nfs服务部署案例

目录 nfs服务介绍 案例信息 服务端部署 安装服务 启动服务 修改配置文件 重新加载配置文件 创建存储目录 客户端部署 安装服务 挂载nfs目录 测试 nfs服务介绍 nfs是网络文件系统&#xff0c;类似与windows的共享文件&#xff0c;用于存储文件。 nfs依赖于rpc服务才…

【C++】抱C++中的函数式编程:使用`std::function`和Lambda表达式简化代码

C自C11标准引入了lambda表达式、std::function和std::bind&#xff0c;为开发者带来了强大的函数式编程特性。函数式编程让代码更加灵活、简洁、可重用&#xff0c;并使得开发者可以轻松处理回调、事件驱动编程和更复杂的函数组合。本文将详细介绍C中函数式编程的关键工具&…

解码专业术语——应用系统开发项目中的专业词汇解读

文章目录 引言站点设置管理具体要求包括&#xff1a; Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池&#xff1f;优化的优势 利用反射改造后端代码&#xff0c;AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…

Linux常用命令1

切换目录 cd [rootlocalhost menge]# cd /[rootlocalhost /]# cd: cd [-L|[-P [-e]] [-]] [目录] 查看当前的目录 pwd 浏览目录内容 ls ls浏览后颜色表示 白色&#xff1a;普通文件 蓝色&#xff1a;目录 红色&#xff1a;压缩包文件 黄色&#xff1a;设备文件 绿…

Python浪漫之画一个圆月亮

效果图&#xff1a; 完整代码&#xff1a; import turtle import time# 创建一个画布 screen turtle.Screen() screen.bgcolor("darkblue") # 设置背景为深蓝色# 创建一个海龟&#xff08;turtle&#xff09;用于绘制月亮 moon turtle.Turtle() moon.color("…

Axure设置面板状态——元件动作二

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01;因为有事断更了三天&#xff0c;从今天开始又回来了&#xff0c;继续为大家分享Axure相关知识点。 课程主题&#xff1a;设置面板状态 主要内容&#xff1a;State状态、推…

UML 总结(基于《标准建模语言UML教程》)

定义 UML 又称为统一建模语言或标准建模语言&#xff0c;是一种标准的图形化建模语言&#xff0c;它是面向对象分析与设计的一种标准表示。尽管UML 本身没有对过程有任何定义&#xff0c;但UML 对任何使用它的方法&#xff08;或过程&#xff09;提出的要求是&#xff1a;支持用…

springboot入门学习笔记

在我们创建了一个Springboot项目之后&#xff0c;我们会看到有很多文件夹和文件 Springboot程序中各类文件的意义 一.pom.xml 在 Spring Boot 项目中&#xff0c;pom.xml&#xff08;Project Object Model&#xff09;文件是 Maven 构建工具的核心配置文件。起到项目信息定义…

S-Function

目录 S-Function介绍 生成S-Function的三种常用手段 使用手写S-函数合并定制代码 使用S-Function Builder块合并定制代码 使用代码继承工具合并定制代码 S-Function介绍 我们可以使用S-Function扩展Simulink对仿真和代码生成的支持。例如&#xff0c;可以使用它们&#xf…

ELK之路第一步——Elasticsearch集群的搭建以及踩坑记录

elasticSearch集群 前言一、架构二、下载三、虚拟机相关设置3.1 创建es用户3.2 为建es用户赋权sudo3.3 更换es目录所属用户 四、Elasticsearch配置文件修改4.1 修改elasticsearch.yml4.2 修改jvm.options4.3 修改jdk路径 五、启动六、启动报错七、可视化界面cerebro 前言 Elk&…