​      使用Audio Session API ,可以指定App需要的音频行为,比如,当播放音频时,使得其他应用App静音或者混和在一起,也可以指定当App的音频被中断(例如被电话)时的行为,还可以让App响应用户的行为,比如插入或拔出耳机,或者响应那些使用声音硬件的事件,比如Clock、日历闹钟或者来电。

from Multimedia Programming Guide

1. Audio Session 基础

1.1 概述

使用Audio Session API ,可以指定App需要的音频行为,比如,当播放音频时,使得其他应用App静音或者混和在一起,也可以指定当App的音频被中断(例如被电话)时的行为,还可以让App响应用户的行为,比如插入或拔出耳机,或者响应那些使用声音硬件的事件,比如Clock、日历闹钟或者来电。

(from Multimedia Programming Guide)

1.2 关于 Audio Session Category

每个category都是一个key,代表应用的一组audio行为。iOS中定义了6个category,每个里面都有一组可以修改的开关,从而可以定制app的audio行为。

每个category针对下面的每种行为设置了一个YES或者NO:

是否允许混音

是否在按下静音按钮或者锁屏时静音

是否支持音频输入

是否支持音频输出

这六个category分别是:

AVAudioSessionCategoryAmbient

AVAudioSessionCategorySoloAmbient

AVAudioSessionCategoryPlayback

AVAudioSessionCategoryRecord

AVAudioSessionCategoryPlayAndRecord

AVAudioSessionCategoryAudioProcessing

category不能自定义,但是可以修改里面的属性。

在不同的时间可以设置不同的category。

1.3 Audio Session的默认行为

默认的category是AVAudioSessionCategoryAmbient,此时的行为是:

支持播放

不支持录音

用户按下静音按钮时app静音

用户按下锁屏按钮时或者自动锁屏时,app静音

应用启动时,其他app静音

当app使用System Sound Services 或者UIKit playInputClick播放短音频时,可以忽略Audio Session处理

1.4 两种Audio Session API

一个是AVAudioSession类,一个是Audio Session Services,即一组C函数,前者使用更方便,后者可以对category的标准行为进行修改,这两组API可以混合使用。

2. 配置Audio Session

2.1 初始化Audio Session对象

如果使用AV Foundation framework 来管理中断, 那么使用

AVAudioSession *session = [AVAudioSession sharedInstance]来初始化session。

如果是自己写一个C函数来处理音频中断,那么使用AudioSessionInitialize来初始化session。

2.2 使得Audio Session活跃和非活跃

app系统时,系统激活app的audio session。当来电或者闹钟响起时,系统使得app的audio session非活跃。当挂电话或者忽略电话时,系统允许app的audio session再次活跃,为了重新激活,需要在处理中断的代码里面使得audio工作。

当使用AVAudioRecorder或者AVAudioPlayer时,系统会在中断处理代码里面使得audio session重新激活。然后,苹果建议在AVAudioSessionDelegate 的delegate函数里面显式地重新激活自己的audio session,从而确保激活成功。

2.3 选择最佳的category

iOS有6个audio session category,三个用于播放,一个用于录音,一个用于录音及播放,一个用于离线音频处理。(详细内容参见Audio Session Programming Guide)

2.4 不同的category会影响编解码

如果覆盖了某个不支持mix的category,将不能使用硬件解码。

2.5  对Category进行微调

可以对audio session category使用不同方法进行微调。

设置audio session的kAudioSessionProperty_OverrideCategoryMixWithOthers属性,可以覆盖原本不支持mix的category,如AVAudioSessionCategoryPlayback和AVAudioSessionCategoryPlayAndRecord,当允许混音后,将不能使用硬件编解码。

可以使用编程方式影响音频输出路由,当使用AVAudioSessionCategoryPlayAndRecord时,音频通常从听筒里输出,可以进行覆盖来使得音频从扬声器输出。

3. 处理Audio Session中断

当遇到中断时,app会shut down,这通常发送在用户接电话时,如果用户选择拒绝电话或者挂掉闹钟,系统触发一个中断结束消息,并使app继续运行,当app恢复运行是,app的audio session需要被激活。

3.1 中断处理技术

两种方式:

(1)实现一个OC 的delegate函数

(2)写一个声明在Audio Session Services中的C函数。

以下是处理中断时需要的工作

After interruption starts

Check whether resumption of audio process is supported

Save state and context

Update user interface

After interruption ends

Restore state and context

Ractivate audio session

Update user interface

当使用AVAudioPlayer或者AVAudioRecorder,系统会自动处理某些工作。

对于不同的音频框架,有不同的音频中断处理技术:

AVFoundation  AVAudioPlayer and AVAudioRecorder 提供了中断开始和结束的delegate函数

Audio Queue Services, I/O audio unit  实现  AVAudioSessionDelegate的函数来处理中断

3.2 中断的生存期

3.3 使用delegate函数来处理中断

AVAudioSessionDelegate提供了beginInterruption 和endInterruption

AVFoundation提供了下列delegate 函数

audioPlayerBeginInterruption

audioPlayerEndInterruption

audioRecorderBeginInterruption

audioRecorderEndInterruption:

3.4 使用callback函数来处理中断

可以使用Audio Session Service里面的C api来注册一个AudioSessionInterruptionListener类型的回调函数处理中断

3.5 硬件辅助的编解码器和音频中断

4. 处理音频硬件路由变化

定义一个回调函数

将回调函数注册到audio session 即可对路由改变事件进行响应

5.对硬件设备的优化

6.与Movies和iPod Music协同工作

7.Audio Session 手册

7.1 初始化audio session

AudioSessionInitialize 或者AVAudioSession *session = [AVAudioSession sharedInstance];

7.2 使激活/使非激活session

NSError *activationError = nil;

BOOL success = [[AVAudioSession sharedInstance] setActive: YES error: &activationError];

if (!success) { /* handle the error in activationError */ }

或者

OSStatus activationResult = NULL;

result = AudioSessionSetActive (true);

7.3 设置category

NSError *setCategoryError = nil;

BOOL success = [[AVAudioSession sharedInstance]

setCategory: AVAudioSessionCategoryAmbient

error: &setCategoryError];

if (!success) { /* handle the error in setCategoryError */ }

或者

UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;    // 1

AudioSessionSetProperty (

kAudioSessionProperty_AudioCategory,                        // 2

sizeof (sessionCategory),                                   // 3

&sessionCategory                                            // 4

);

7.4  检查app启动时是否有其他app在播放音频

UInt32 otherAudioIsPlaying;                                   // 1

UInt32 propertySize = sizeof (otherAudioIsPlaying);

AudioSessionGetProperty (                                     // 2

kAudioSessionProperty_OtherAudioIsPlaying,

&propertySize,

&otherAudioIsPlaying

);

if (otherAudioIsPlaying) {                                    // 3

[[AVAudioSession sharedInstance]

setCategory: AVAudioSessionCategoryAmbient

error: nil];

} else {

[[AVAudioSession sharedInstance]

setCategory: AVAudioSessionCategorySoloAmbient

error: nil];

}

7.5 修改播放混音行为

OSStatus propertySetError = 0;

UInt32 allowMixing = true;

propertySetError = AudioSessionSetProperty (

kAudioSessionProperty_OverrideCategoryMixWithOthers,  // 1

sizeof (allowMixing),                                 // 2

&allowMixing                                          // 3

);

7.6 优化电量消耗

7.7 优化低延迟

7.8 改变输出路由

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;  // 1

AudioSessionSetProperty (

kAudioSessionProperty_OverrideAudioRoute,                         // 2

sizeof (audioRouteOverride),                                      // 3

&audioRouteOverride                                               // 4

);

7.9  对audio session 中断作出相应

7.10 对音频硬件路由改变事件进行响应(路由改变事件指用户插入或拔出耳机,将手机插上dock或者拨出dock)

定义一个回调函数

将回调函数注册到audio session 即可对路由改变事件进行响应

7.11 查询音频硬件特性

可以设置音频硬件的采样率以及io buffer duration

查询设备是否支持录音

#if TARGET_IPHONE_SIMULATOR判断是否是在模拟器上运行

iOS音频学习笔记三:音频会话管理的更多相关文章

  1. 【JSP&Servlet学习笔记】4.会话管理

    Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...

  2. 操作系统学习笔记(三) windows内存管理

    //系统物理页面是由 (Page Frame Number Database )简称PFN数据库来进行管理,实际上是一个数组,每个物理页面都对应一个PFN项. 进程的地址空间是通过VAD(Virtua ...

  3. Spring学习笔记三:Bean管理

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6775827.html  一:如何使用Spring获取对象 1:定义bean类:要按照注入方式来定义对应的bea ...

  4. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  5. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  6. kvm虚拟化学习笔记(三)之windows kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  7. Liunx学习笔记(三) 文件权限

    一.文件权限 1.查看文件权限 (1)文件权限 在 Linux 中对于文件有四种访问权限,列举如下: 可读取:r,Readable 可写入:w,Writable 可执行:x,Execute 无权限:- ...

  8. MySql学习笔记三

    MySql学习笔记三 4.DML(数据操作语言) 插入:insert 修改:update 删除:delete 4.1.插入语句 语法: insert into 表名 (列名1,列名2,...) val ...

  9. 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus

    物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...

随机推荐

  1. 如何发布H5界面可以让公网访问

    本文链接:https://blog.csdn.net/u013310119/article/details/81233560问题背景:手机APP里的H5界面要发布到公网,提供给第三方APP调用. 解决 ...

  2. 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)

    一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...

  3. 123457123456#0#----com.ppGame.ChengYu43--前拼后广--成语caicaicai_pp

    com.ppGame.ChengYu43--前拼后广--成语caicaicai_pp

  4. PL-SQL Developer 配置使用Oracle客户端连接

    没有在本地安装Oracle 的用户必须下载一个instantclient(即使客户端), 路径指向这里,才能正常使用 下载 instantclient-basic-nt-11.2.0.3.0.zip ...

  5. SVN还原项目到某一版本(转)

    将本地的项目通过SVN还原到某一版本,并将SVN服务器上的项目也还原到这一版本 第一步:新建一个文件夹,如test,选中test右键-checkout到最新版本 第二步:选中test,右键-Torto ...

  6. FileZilla下载文件失败

    之前一直可以下载文件,突然某天下载报错, 方法一:修改本地站点

  7. Data - 【转】数据分析的道与术

    简要说明 本文来自网络流传的"百度内部培训PPT - 数据分析的道与术",版权属于"百度",如有冒犯,即刻删除. PDF下载 - 数据分析的道与术 什么是数据分 ...

  8. networkx详细教程

    写在前面:城市计算研究中经常涉及到图论的相关知识,而且常常面对某些术语时,根本不知道在说什么.最近接触了NetworkX这个graph处理工具,发现这个工具已经解决绝大部分的图论问题(也许只是我自己认 ...

  9. python解包

    概念 python的解包可以这样来理解:把元素给拆分并把其赋值给自己所需要的变量,因此元素应该是一个可迭代对象. 形式 简单版本 下面展示的是解包的基本形式,根据长度赋值给对应多的变量. name_l ...

  10. [计算机视觉][ARM-Linux开发] Ubuntu14.04安装OpenCV3.2中遇到的问题的解决方案

    2. ubuntu下,opencv3.x安装一直downloading这个包,要看超时信息里的下载路径,把它放到下载路径中,比如我的opencv3.2.0源文件路径为/home/han/softwar ...