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.mzph.cn/bicheng/58035.shtml

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

相关文章

一文详解高光谱数据python处理包spectral(SPy)

一、基本操作 读取高光谱数据文件 import spectral # 读取ENVI格式的高光谱图像 # image的后缀可以是.raw、.spe、.lan等 # 代码里img对象,类似于rasterio库的dataset对象,可以用它来读取高光谱数据 img spectral.envi.read_envi(filemy_data.hdr, im…

【LeetCode】修炼之路-0008- String to Integer (atoi)【python】

题目 基本思路 其实题目已经说了如何实现了,我们按照给定的思路实现即可 1. 问题四大要求详解 1.1 处理空格 (Whitespace) 忽略字符串开头的任何空格字符 (" ")例如: " 123" 应该被处理为 “123”Python实现: 可以使用 strip() 方法或循环处…

Python浪漫之星星与文字构造的错位图

效果图: 完整代码: import tkinter as tk import random import math from tkinter.constants import *width 888 height 500 heartx width / 2 hearty height / 2 side 11class Star:def __init__(self, canvas, x, y, size):self.canvas canvas…

精准医疗沟通新体验:开源语音识别(ASR)如何提升医生与患者对话

需求背景:一家远程医疗公司在为偏远地区提供在线医疗服务的过程中,发现传统手动记录方式效率太低,无法满足需求,影响就诊的效率。 解决方案:使用思通数科的ASR平台,公司可以实现多话者对话转录和自动病历生…

MySql中的事务、MySql事务详解、MySql隔离级别

文章目录 一、什么是事务?二、事务四大特性ACID2.1、原子性(Atomicity)2.2、一致性(Consistency)2.3、隔离性(Isolation)2.4、持久性(Durability) 三、事务操作/事务的用…

MySQL-27.多表查询-案例

一.数据准备 -- 分类表 create table category (id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 分类名称,type tinyint unsigned not null comment 类型 1 菜品分类 2 套餐分类,sort …

今日所学1024和1026

1 简便方法: 在文件夹里找到dll的文件路径,然后在系统变量里添加对应路径, 就不会报错了。 2关于报Qt插件的错,解决办法如下 1026Github的2FA 超级详细的github双重验证密码忘记或者获取不了了怎么办&github recovery code忘记怎么办…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中,每一层都会添加自己的头部信息,最终形成完整的数据包。具体来说: 应用层生成的应用程序…

洛谷 P3130 [USACO15DEC] Counting Haybale P

原题链接 题目本质:线段树 感觉我对线段树稍有敏感,线段树一眼就看出来了,思路出来得也快,这道题也并不是很难。 解题思路: 这道题能看出来是线段树就基本成功一半了,区间修改区间查询,就基…

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目: 样例: 可以看见,唯一特殊的就…

深度学习-循环神经网络-LSTM对序列数据进行预测

项目简介: 使用LSTM模型, 对文本数据进行预测, 每次截取字符20, 对第二十一个字符进行预测, LSTM层: units100, activationrelu Dense层: units输入的文本中的字符种类, 比如我使用的文本有644个不同的字符, 那么units64 激活函数: 因为是多分类, 使用softmax 因为这是最…

使用Vue.js构建响应式Web应用

💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用Vue.js构建响应式Web应用 1 引言 2 Vue.js简介 3 安装Vue CLI 4 创建Vue项目 5 设计应用结构 6 创建组件 7 使用…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片,flag就在图片上,不过不太明显,写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

GCN+BiLSTM多特征输入时间序列预测(Pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GCNBiLSTM多特征输入时间序列预测(Pytorch) 可以做风电预测,光伏预测,寿命预测,浓度预测等。 Python代码,基于Pytorch编写 1.多特征输入单步预测…

【大数据学习 | kafka】kafuka的基础架构

1. kafka是什么 Kafka是由LinkedIn开发的一个分布式的消息队列。它是一款开源的、轻量级的、分布式、可分区和具有复制备份的(Replicated)、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比,KafKa能够很好…

MySQL-DQL练习题

文章目录 简介初始化表练习题 简介 本节简介: 主要是一些给出一些习题, 关于DQL查询相关的, DQL查询语句是最重要的SQL语句, 功能性最复杂, 功能也最强, 所以本节建议适合以及有了DQL查询基础的食用, 另外注意我们使用的是Navicat, SQL编辑的格式规范也是Navicat指定的默认格式…

Android 15: 探索未来的可能性

Android 15: 探索未来的可能性 随着技术的不断进步,我们的智能手机系统也在不断地进化。Android 15,作为谷歌最新推出的操作系统版本,带来了一系列令人兴奋的新特性和改进,让我们的数字生活更加丰富多彩。本文将带你一探Android 15的新特性,感受科技的魅力。 低光增强:…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中,我们将一起深入了解K8s权限维持的攻击手法,通过研究这些攻击手法的技术细节,来更好地认识K8s权限维持所带来的安全风险。 在这个课程中,我们将学习以下内容: K8s权限维持:简单介绍K8s权限维持…

安装OpenResty

OpenResty OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点: 具备Nginx的完整功能 基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块…

python多线程处理xlsx,多进程访问接口

import pandas as pd from concurrent.futures import ThreadPoolExecutor# 读取Excel文件 file_path scence.xlsx df pd.read_excel(file_path)# 定义每10行处理逻辑 def process_rows(start_idx):end_idx min(start_idx 10, len(df)) # 处理每10行for i in range(start_…