AVAudioSession应用指南
转coco-LG
audiosession负责调节你的app和ios系统里的音频行为.一旦加载了audiosession你可以获得一个audiosession的单例.你可以配置这个audiosession来控制你的app的音频行为.例如:
- 当你的app播放声音的时候,你是希望其他正在播放声音的app静音还是混合两个app的声音?
- 你的app如何回应突发的打断,例如这时候闹铃突然响了?
- 你的app又该如何回应耳机口的拔插呢?
AuioSession的配置会影响你的app在运行中所有的音频活动,除了利用System Sounds Services API控制的音频.
你还可以利用AudioSession来检测你所用硬件的参数,例如声道和采样率.
你还可以随时激活或者停止你的audioSession,当你的app播放声音或者正在录音的时候,你必须确保AudioSession处于激活状态.
系统也有权利随时中断你的audioSession,例如,当你来电话的时候.当然,AudioSession提供了api来让你的app从这种中断中恢复.
一、实例化
- AVAudioSession *audioSession = [AVAudioSession sharedInstance];
可以看出AVAudioSession是个单例对象。
二、类别设置
在获得一个AVAudioSession类的实例后,你就能通过调用音频会话对象的setCategory:error:实例方法,来从IOS应用可用的不同类别中作出选择。类别分为一下几种:
- #pragma mark -- Values for the category property --
- /* Use this category for background sounds such as rain, car engine noise, etc.
- Mixes with other music. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;
- /* Use this category for background sounds. Other music will stop playing. */
- AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;
- /* Use this category for music tracks.*/
- AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;
- /* Use this category when recording audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;
- /* Use this category when recording and playing back audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;
- /* Use this category when using a hardware codec or signal processor while
- not playing or recording audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing NS_DEPRECATED_IOS(3_0, 10_0) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
1.AVAudioSessionCategoryAmbient
用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音2.AVAudioSessionCategorySoloAmbient类似于AVAudioSessionCategoryAmbient不同之处在于它会中止其它应用播放声音。 这个category为默认category。该Category无法在后台播放声音3.AVAudioSessionCategoryPlayback用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。可在后台播放声音4.AVAudioSessionCategoryRecord用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。5. AVAudioSessionCategoryPlayAndRecord用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,在该Category下声音的默认出口为听筒(在没有外接设备的情况下)。注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。
三、恢复外部音乐
从上面的类别可以看出,在录音或播音的的时候是会关闭外部正在播放的音频。比如微信发语音的时候,正在播放的音乐会停止。但是录完之后需要让外部音效继续播放。这个需要手动设置:
- [[AVAudioSession sharedInstance] setActive:NO
- withFlags:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation
- error:nil];
这里需要注意一个问题,如果在录音或播音前本来就没有外部音效播放,直接执行这一句会使cocos2d里面的部分音效异常。所以,在开始录音或播音之前先判断一下是否有外部音效播放,然后用一个标志位记录,在录音或播音完成之后对这个标志位做判断,如果有外部音效,则执行上边的代码去恢复外部音效。下面是判断外部音效的代码:
- -(BOOL) isOtherAudioPlaying {
- UInt32 isPlaying = 0;
- UInt32 varSize = sizeof(isPlaying);
- AudioSessionGetProperty (kAudioSessionProperty_OtherAudioIsPlaying, &varSize, &isPlaying);
- return (isPlaying != 0);
- }
四、协调当前应用的背景音效
如果当我们遇到这样一种情况:自己的应用有背景音乐,这时候需要录音,录完音还要恢复播放背景音乐。这个只需要再设置一次背景音乐的类别,一般背景音乐都是系统默认类别:
- [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
五、注意点
1.如果在录音或播音前本来就没有外部音效播放,直接执行这一句会使cocos2d里面的部分音效异常。所以,在开始录音或播音之前先判断一下是否有外部音效播放,然后用一个标志位记录,在录音或播音完成之后对这个标志位做判断,如果有外部音效,则执行上边的代码去恢复外部音效;
2.有背景音乐的时候执行“恢复外部音乐”出现警告Deactivating an audio session that has running I/O
具体讲解请参考:http://blog.csdn.net/gang544043963/article/details/53323270
AVAudioSession应用指南的更多相关文章
- AVAudioSession(2):定义一个 Audio Session
本文转自:AVAudioSession(2):定义一个 Audio Session | www.samirchen.com 本文内容主要来源于 Defining an Audio Session. A ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- UE4新手之编程指南
虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...
- JavaScript权威指南 - 对象
JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- Atitit.研发管理软件公司的软资产列表指南
Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...
- HA 高可用软件系统保养指南
又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...
- 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南
欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ...
随机推荐
- 深度学习原理与框架-RNN网络框架-LSTM框架 1.控制门单元 2.遗忘门单元 3.记忆门单元 4.控制门单元更新 5.输出门单元 6.LSTM网络结构
LSTM网络是有LSTM每个单元所串接而成的, 从下面可以看出RNN与LSTM网络的差异, LSTM主要有控制门单元和输出门单元组成 控制门单元又是由遗忘门单元和记忆门单元的加和组成. 1.控制门单元 ...
- 爬虫--Scrapy-基于RedisSpider实现的分布式爬虫
爬取网易新闻 需求:爬取的是基于文字的新闻数据(国内,国际,军事,航空) 先编写基于scrapycrawl 先创建工程 scrapy startproject 58Pro cd 58Pro 新建一个爬 ...
- 在IDEA中修改项目的名称
- 使用curator框架简单操作zookeeper 学习笔记
Curator 操作是zookeeper的优秀api(相对于原生api),满足大部分需求.而且是Fluent流式api风格. 参考文献:https://www.jianshu.com/p/70151f ...
- fopen函数出现段错误
昨天写代码的时候突然发现了一个问题,当使用fopen("<filepath>", "r")时,如果filepath不存在,那么fopen函数并不是像 ...
- android布局管理器
1 LinearLayout (线性布局) 让所有的组件都成为单一的方向,机垂直的或水平的(默认). android:Layout_weight //该属性控制水平和垂直方向某个控件所占比例. 2.F ...
- 3dmax快捷键
P 透视图 F前视图 L 左视图 T 顶视图 B 底视图单窗口与四窗口的切换快捷键是 alt+w 渲染快捷键 shilf+q 独立 快捷键 alt+q 自己多记点快捷键哦!!!!3DMAX2009快捷 ...
- OpenCV Python : No drawMatchesknn function
2 down vote The functions cv2.drawMatches and cv2.drawMatchesKnn are not available in newer versions ...
- 微信小程序-获取当前城市位置及再次授权地理位置
微信小程序-获取当前城市位置 1. 获取当前地理位置,可通过wx.getLocation接口,返回经纬度.速度等信息; 注意---它的默认工作机制: 首次进入页面,调用该api,返回用户授权结果,并保 ...
- kafka 清除topic数据脚本
原 kafka 清除topic数据脚本 2018年07月25日 16:57:13 pete1223 阅读数:1028 #!/bin/sh param=$1 echo " ...