张东轩的博客

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。

0%

Audio Session编程指南(一)

一、介绍

Audio 是被iOS系统接管的服务,系统通过Audio Session管理了第三方App、系统内置App以及设备级别的音频行为。

你可以通过Audio Session告诉系统你想在你的App中怎样使用音频,Audio Session扮演了Application与操作系统或者说是底层音频硬件之间的中介者,这样在和音频硬件进行互动时就不用进行详细的配置说明,将这些细节由Audio Session管理可以可以确保音频的使用体验。

二、概要

我们使用AVAudioSession实例来和App的audio session来进行交互,

  • 配置audio session的 category and mode 来告诉系统你的App打算如何使用音频;
  • 激活App的audio session从而使得category and mode生效;
  • 订阅audio session的notifications,并对audio interruptions 和 route changes事件作出响应;
  • 执行高级的音频设配配置,例如设置采样率、 I/O buffer duration 和 声道数;

三、Category

audio session category 是代表音频行为的主要机制,通过设置category可以设置App用是输入还是输出路由,并且可以设置在播放音频的同时是否同时播放其他App的音乐。
AVFoundation定义了一系列的audio session categories,不同的categories分别可以支持playback、recording、playback with recording。

Audio Session Category 的表现行为

Category 是否遵循静音键
OR锁屏
是否打断其他App 要求输入或输出
AVAudioSessionCategoryAmbient Yes No(混音播放) Output only
AVAudioSessionCategorySoloAmbient Yes YES(独占播放) Output only
AVAudioSessionCategoryPlayback NO Yes(独占播放,可后台播放)
NO(override switch)
Output only
AVAudioSessionCategoryRecord NO
(锁屏录音继续)
YES(录音模式) Input only
AVAudioSessionCategoryPlayAndRecord No Yes(播放和录音,可录音可播放)
NO(override switch)
Input and output
AVAudioSessionCategoryMultiRoute No Yes(多种输入输出,
例如可以耳机、USB设备同时播放)
Input and output
AVAudioSessionCategoryAudioProcessing No Yes(硬件解码音频,
此时不能播放和录制)
Input and output

总结各种Category的特点

  • AVAudioSessionCategoryAmbient

Ambient中文意思是四周的,环绕的,只用于播放,并且可以和其他App音频的音频一起播放,例如可以玩游戏的同时听其他App播放的音乐。跟随静音键和锁屏静音。

  • AVAudioSessionCategorySoloAmbient

Solo中文意思是独奏,独唱的,也是只用于播放,但是不能和其他App音频的音频一起播放。跟随静音键和锁屏静音。

  • AVAudioSessionCategoryPlayback

只用于播放,不能和其他App一起播放,不跟随锁屏或者静音键,同时可以在退后台的时候继续播放。像QQ音乐,会使用这种模式

  • AVAudioSessionCategoryRecord

只用于录音,启动时会打断其他App的音频

  • AVAudioSessionCategoryPlayAndRecord

只用于录音和播放,比如在微信VOIP语音通话场景,自己既需要录音,也需要播放其他人的声音

  • AVAudioSessionCategoryMultiRoute

其他的Category都是使用最后一个接入的设备作为输入输出的源,MultiRoute可以使用所有的接入设备作为输出源,例如可以将声音同时输出到耳机和HDMI设备;支持的组合如下:
USB and headphones、HDMI and headphones、LineOut and headphones,另外只支持一个录音设备的接入;

四、提示

后台播放

为了让自己的App可以在锁屏、静音键打开、退后台、画中画的情况下继续播放音频,或
需要在Info.plist文件的UIBackgroundModes中加入audio或者项目的配置页中Background Modes中的“Audio, AirPlay, and Picture in Picture”选项打开

category切换

官方建议在更改audio session的category或者其他的audio session的属性前,最好将audio session进行deactivate,这样可以避免audio系统在category等配置改变的时候进行不必要的重新配置。