【IOS】Audio Session Programming G
简介
IOS 通过 <em>音频会话(Audio Session)</em> 和 <code>AVAudioSession</code> 中的 <strong>API</strong> 来实现对于不同 App 之间、同一 App 内及硬件层面的各种音频行为。
图片来自官方文档kk说:为了语句的通顺,Audio一词在本系列文章中可能会被翻译为音频或声音,特此说明。
<code>AVAudioSession</code> 中的 API 可以处理类似这样的问题:
- 手机在从铃声切换到静音模式时,App 中的音频是否需要静音?举例来说,旨在帮助用户在会议中做笔记的 App 应当在手机处于静音模式时静音,以免打扰他人;而具有发音功能的词典类 App,则应保证不被手机的模式影响,在用户需要的时候播放声音。
- 当 App 开始播放声音的时候,系统已经在播放的其他声音是否需要关闭?用于让用户跟着背景音乐利用 App 中的功能来进行合奏的 App 中,背景音乐当然要继续;但如果 App 的功能是网络电台,那么就应该让其他的声音都停止。
IOS 设备中的音频使用场景十分复杂:用户随时可能插拔耳机、接打电话,系统的闹钟也可能在使用其他音频的过程中响起。开发者只需要编写少量调用音频会话 API 的代码,就可以配置音频会话的属性,从而优雅的对系统请求作出回应。
概览
使用 <code>AVAudioSession</code> 可以:
- 选择合适的音频输入输出源(route)
- 决定如何从其他 App 中集成音频
- 处理来自其他 App 的“骚扰”
- 为某一类型的 App 自动配置音频属性?(automatically configure audio for the type of app you are creating)
一次音频会话中包含了一系列的音频行为
音频会话是 App 和 IOS 之间的媒介,用来为 App 配置相关的音频属性和行为。在加载过程中,App 会自动创建一个音频会话的单例。
用类别(categories)来描述音频 role
<i>音频会话类别</i>是用来描述音频行为的主要机制。通过设置类别可以表明:App是否使用音频输入输出源,在播放音频时是否支持其他背景音乐的播放,以及一些其他的属性。开发者设计的音频行为应当符合用户的期望。
开发者可以通过七个类别和一些override and modifier switches,结合 App 的身份来定制音频 role。不同的类别分别支持后台播放(playback)、录音和后台录音等功能。当系统了解 App 的音频 role 后,会为其提供合适的硬件资源,令其免于受到设备上的其他音频事件的干扰。
kk说:想不出合适的词来表达 role 的含义,用“身份”或“角色”都显得有些模糊,因此不做翻译
音频类别的套路(Modes Customize Categories)
用户对于特定种类的 App 中(声音的)处理方式会有特定的期待。某一类别的行为会表现为一种套路。举例来说,系统可能会为使用默认模式和录像模式的 App 选择不同的麦克风作为音频输入,或者为用于录像场景的 App 启用麦克风信号处理。
kk说:这一段翻译不好,原文如下:
Users expect certain behaviors from certain categories of apps. Modes specialize the behavior of a given category. For example, when an app uses the Video Recording mode, the system may choose a different built-in microphone than it would if it was using the default mode. The system may also engage microphone signal processing that is tuned for video recording use cases.
基于通知(Notifications)的中断处理机制(interruption handling)
<i>音频中断(audio interruption)</i>指的是音频会话被关闭的行为,会导致 App 中的音频立即停止。当一个未被系统归类为可以和自己混合的其他音频会话启用时,就会中断当前的 App。当中断发生时,系统会向 App 发出一个“你被中断”信号,App可以在接到这个信号的时候完成保存状态、更新UI等操作。
开发者可以通过向 <code>AVAudioSession </code> 中的 <code>AVAudioSessionInterruptionNotification </code> 注册来处理中断。开发者应该重写 <code>beginInterruption</code> 和 <code>endInterruption</code> 方法,来减小对用户造成的中断,并提供最优雅的中断恢复方案。
基于通知的音频源切换处理
用户在插拔外接音频设备或插拔耳机的时候,会期待系统能够按自己的想法进行输入输出源的切换。IOS Human Interface Guidelines 中关于声音的章节描述了这些用户期待,并提供了一些关于如何满足这个期待的指导。通过向 <code>AVAudioSessionRouteChangeNotification </code> 中注册来处理音频源的切换。
对类别的特性进行调整
开发者可以用不同的方式来对音频会话类别进行调整,来改变类别的属性,包括:
- 允许(缺省条件下不能与其他音频混合的)类别与其他(来自QQ音乐等 App 的)音频混合。
- 将音频的输出源从输入源改为扩音器。
- 允许蓝牙音频输入源。
- 在播放 App 的音频时,要求降低其他的 App 音频的音量。
- 在运行时为 App 选择最优的硬件设备。在 App 运行时,开发者的代码可以根据当前的设备环境及用户插拔设备引发的变化,进行动态的调整和适应。
前置知识
在学习这些内容前,开发者需要对 Cocoa Touch 开发有一定的了解(App Programming Guide for IOS 中关于Core Audio和Core Audio Overview中的章节)。同时,由于音频会话通常会基于终端用户实际的使用场景,因此也需要对IOS设备,和 IOS Human Interface Guidelines有所了解。
其他
参见以下资料:
- AVAudioSession Class Reference,官方手册中关于AudioSession类的介绍
- AddMusic,样例代码,展示如何协调app间的音频操作
kk说:以上内容翻译自苹果官方文档,仅供学习,请勿用于商业用途,侵删。转载注明出处。