AVAudioSession初探
根据文档,AudioSession规定了app和系统音频行为交互的规范,一个app只有一个AudioSession的单例。
app通过设置自己AudioSession的单例的属性来告诉系统自身想达到的效果,系统会根据app的申请,并综合考虑其他app的AudioSession的属性来决定最后硬件的音频输入和输出。
AVAudioSession的category
AVAudioSession可以通过设置category的类型类配置AVAudioSession的一些属性,如
- 在静音开关打开或锁屏的情况下是否可以继续播放
- 是否可以和其他APP的声音混合播放
- 是否允许输入输出
下表是文档中给出的可以设置的category及其对应的表现。

在程序中切换category
在程序的运行过程中,有时需要切换AVAudiosession的Category。通过调用- (BOOL)setCategory:(NSString *)category error:(NSError **)outError;
这个方法可以达到效果。
然而,不是所有的category的切换都是即时发生的。由于涉及到硬件,有些category的切换需要时间,有些category的切换不需要时间或需要的时间很短。
下面的结论是在AVAudioSessionCategoryPlayAndRecord
、AVAudioSessionCategoryPlayback
、AVAudioSessionCategorySoloAmbient
之间的切换所需时间。
from | to | 时间(s) |
---|---|---|
PlayAndRecord | Playback | 0.3-0.4 |
PlayAndRecord | SoloAmbient | 0.3-0.4 |
Playback | SoloAmbient | 0.01 |
Playback | PlayAndRecord | 0.3-0.4 |
SoloAmbient | PlayAndRecord | 0.3-0.4 |
SoloAmbient | Playback | 0.01 |
可见,涉及到input和output改变的category切换的花费的时间较多。可以猜想改变input和output的行为设计到硬件,切换需要时间。
测试环境
iOS10,iPhone6, 真机,且测试时有音频在播放
代码如下
- (void)changeCategory:(NSString*)category
{
NSError *error = nil;
NSString *currentCategory = [[AVAudioSession sharedInstance] category];
NSLog(@"before set category, category is %@",currentCategory);
[[AVAudioSession sharedInstance] setCategory:category error:&error];
NSLog(@"after set category");
currentCategory = [[AVAudioSession sharedInstance] category];
NSLog(@"category is %@",currentCategory);
if (error != nil)
{
NSLog(@"category error %@",error);
}
}
AVAudioSession初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- js的日期格式化
function date(){ var date = new Date(); var year = date.getFullYear(); var month = date.getMonth()+1 ...
- JAVA 设计模式 状态模式
用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构
- 【模式匹配】KMP算法的来龙去脉
1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...
- Winform应用程序实现通用遮罩层
在WEB上,我们在需要进行大数据或复杂逻辑处理时,由于耗时较长,一般我们会在处理过程中的页面上显示一个半透明的遮罩层,上面放个图标或提示:正在处理中...等字样,这样用户体验就比较好了,然而如果在Wi ...
- 《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
从现在开始相关文章请到: http://lko2o.com/moon 接着上一篇:<ASP.NET SignalR系列>第三课 SignalR的支持平台 一.概述 SignalR常常依托于 ...
- Emit学习(2) - IL - 对象的创建过程
上一篇的介绍中, 并没有介绍到对象的创建过程, 这一篇主要就介绍一下, 对象的创建过程. 其实熟悉了IL语法之后, 完全可以用Reflector反编译代码去查看. 而且正因为有这个工具, 可以对照着R ...
- JS打印页面指定区域
错误的写法: //打印 function printPage(areaId) { if (parent.$("#PrinFrame").length == 0) { parent. ...
- silverlight制作虚线的边框
<Grid><Grid HorizontalAlignment="Center" VerticalAlignment="Center" x:N ...
- Model元数据定制与Model模板
元数据这一词对于计算机科学来说不算陌生,对元数据的解释最简单的解释就是描述数据的数据,那么Model元数据当然是描述Model中各种成员的数据了,在ASP.NET MVC中ModelMetadata这 ...
- javascript学习笔记1-document.write
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...