【IOS】Audio Session Programming Guide 翻译 by kk(一)

简介

IOS 通过 音频会话(Audio Session)AVAudioSession 中的 API 来实现对于不同 App 之间、同一 App 内及硬件层面的各种音频行为。

kk说:为了语句的通顺,Audio一词在本系列文章中可能会被翻译为音频或声音,特此说明。

【IOS】Audio Session Programming Guide 翻译 by kk(一)_第1张图片
图片来自官方文档

AVAudioSession 中的 API 可以处理类似这样的问题:

  • 手机在从铃声切换到静音模式时,App 中的音频是否需要静音?举例来说,旨在帮助用户在会议中做笔记的 App 应当在手机处于静音模式时静音,以免打扰他人;而具有发音功能的词典类 App,则应保证不被手机的模式影响,在用户需要的时候播放声音。
  • 当 App 开始播放声音的时候,系统已经在播放的其他声音是否需要关闭?用于让用户跟着背景音乐利用 App 中的功能来进行合奏的 App 中,背景音乐当然要继续;但如果 App 的功能是网络电台,那么就应该让其他的声音都停止。

IOS 设备中的音频使用场景十分复杂:用户随时可能插拔耳机、接打电话,系统的闹钟也可能在使用其他音频的过程中响起。开发者只需要编写少量调用音频会话 API 的代码,就可以配置音频会话的属性,从而优雅的对系统请求作出回应。


概览

使用 AVAudioSession 可以:

  • 选择合适的音频输入输出源(route)
  • 决定如何从其他 App 中集成音频
  • 处理来自其他 App 的“骚扰”
  • 为某一类型的 App 自动配置音频属性?(automatically configure audio for the type of app you are creating)

一次音频会话中包含了一系列的音频行为

音频会话是 App 和 IOS 之间的媒介,用来为 App 配置相关的音频属性和行为。在加载过程中,App 会自动创建一个音频会话的单例。

用类别(categories)来描述音频 role

音频会话类别是用来描述音频行为的主要机制。通过设置类别可以表明: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)

音频中断(audio interruption)指的是音频会话被关闭的行为,会导致 App 中的音频立即停止。当一个未被系统归类为可以和自己混合的其他音频会话启用时,就会中断当前的 App。当中断发生时,系统会向 App 发出一个“你被中断”信号,App可以在接到这个信号的时候完成保存状态、更新UI等操作。
开发者可以通过向 AVAudioSession 中的 AVAudioSessionInterruptionNotification 注册来处理中断。开发者应该重写 beginInterruptionendInterruption 方法,来减小对用户造成的中断,并提供最优雅的中断恢复方案。

基于通知的音频源切换处理

用户在插拔外接音频设备或插拔耳机的时候,会期待系统能够按自己的想法进行输入输出源的切换。IOS Human Interface Guidelines 中关于声音的章节描述了这些用户期待,并提供了一些关于如何满足这个期待的指导。通过向 AVAudioSessionRouteChangeNotification 中注册来处理音频源的切换。

对类别的特性进行调整

开发者可以用不同的方式来对音频会话类别进行调整,来改变类别的属性,包括:

  • 允许(缺省条件下不能与其他音频混合的)类别与其他(来自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说:以上内容翻译自苹果官方文档,仅供学习,请勿用于商业用途,侵删。转载注明出处。

你可能感兴趣的:(【IOS】Audio Session Programming Guide 翻译 by kk(一))