1.配置音频会话

1.1处理”铃声/静音”开关切换

测试上一节  使用AVAudioPlayer播放音频 的程序,当开始播放音频时切换设备侧面的”铃声/静音”开关,会发现音频输出也会在这两种状态下切换.为了让我们的程序在这两种状态下都能正常输出音乐,需要在程序启动时对音频会话进行明确的配置.在  )application: didFinishLaunchingWithOptions: 中加入如下代码即可:

 AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
[session setActive:YES error:nil];

1.2后台播放

当设备锁定或者应用进入后台时,如果也希望能正常播放音乐,还需要在工程中设置  Background Modes ,有两种方法进行设置.

第一种,在Xcode中找到项目的  info.plist ,新添加一行名为  Required background modes 的数组,并在其中添加一项  App plays audio or streams audio/video using AirPlay .

第二种,打开  TARGETS 下的  Capabilities 的分类,找到  Background Modes ,并在其子目录中勾选  Audio,AirPlay and Picture in Picture .

2.中断处理

中断在移动设备中经常出现,比如电话呼入,闹钟响起等情况.对iOS来说,当中断发生时,播放中的音频会慢慢消失和暂停.这一效果是系统自动实现的,不过当中断消失时,音频并不会自动恢复.所以我们需要编写代码解决这个问题.

2.1中断通知

中断发生时,应用程序的AVAudioSession会发送通知  AVAudioSessionInterruptionNotification ,注册通知代码如下:

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];

在接收到通知的userInfo中,会包含一个  AVAudioSessionInterruptionTypeKey ,用来标识中断开始和中断结束.

当中断类型为  AVAudioSessionInterruptionTypeKeyEnded 时,userInfo中还会包含一个  AVAudioSessionInterruptionOptions 来表明音频会话是否已经重新激活以及是否可以再次播放.示例代码如下:

- (void)handleInterruption:(NSNotification *)notification
{
NSDictionary *info = notification.userInfo;
AVAudioSessionInterruptionType type = [info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
if (type == AVAudioSessionInterruptionTypeBegan) {//Handle InterruptionBegan
}else{AVAudioSessionInterruptionOptions options = [info[AVAudioSessionInterruptionOptionKey] unsignedIntegerValue];if (options == AVAudioSessionInterruptionOptionShouldResume) {//Handle Resume}
}
}

2.2 线路改变

在iOS设备上添加或移除音频输入,输出线路时,会发生线路改变,比如用户插入耳机或断开USB麦克风.当这些事件发生时,音频会根据情况改变输入或输入线路,同时AVAudioSession会发送一个相关变化的通知  AVAudioSessionRouteChangeNotification .注册通知的相关代码如下:

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRouteChange:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];

根据苹果公司的文档,当用户插入耳机时,隐含的意思是用户不希望外界听到具体的音频了内容,这就意味着当用户断开耳机时,播放的内容可能需要保密,所以我们需要在断开耳机时停止音频播放.

AVAudioSessionRouteChangeNotification 通知的userinfo中会带有通知发送的原因信息及前一个线路的描述.线路变更的原因保存在userinfo的  AVAudioSessionRouteChangeReasonKey 值中,通过返回值可以推断出不同的事件,对于旧音频设备中断对应的reason为  AVAudioSessionRouteChangeReasonOldDeviceUnavailable .但光凭这个reason并不能断定是耳机断开,所以还需要使用通过  AVAudioSessionRouteChangePreviousRouteKey 获得上一线路的描述信息,注意线路的描述信息整合在一个输入NSArray和一个输出NSArray中,数组中的元素都是  AVAudioSessionPortDescription 对象.我们需要从线路描述中找到第一个输出接口并判断其是否为耳机接口,如果为耳机,则停止播放.

具体代码如下:

- (void)handleRouteChange:(NSNotification *)notification
{
NSDictionary *info = notification.userInfo;
AVAudioSessionRouteChangeReason reason = [info[AVAudioSessionRouteChangeReasonKey] unsignedIntegerValue];
if (reason == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {  //旧音频设备断开//获取上一线路描述信息AVAudioSessionRouteDescription *previousRoute = info[AVAudioSessionRouteChangePreviousRouteKey];//获取上一线路的输出设备类型AVAudioSessionPortDescription *previousOutput = previousRoute.outputs[0];NSString *portType = previousOutput.portType;if ([portType isEqualToString:AVAudioSessionPortHeadphones]) {}
}
}

音视频:AVAudioPlayer:中断处理相关推荐

  1. 【音视频】iOS AVAudioSession梳理

    AVAudioSession 概述 AVAudioSession是一个对象,用于向系统传达你将如何在应用程序中使用音频. 使用AVAudioSession可以向操作系统描述应用程序使用音频的一般策略, ...

  2. IOS音视频(一)AVFoundation核心类

    IOS音视频(一)AVFoundation核心类 1. AVFoundation框架架构简介 1.1 AVFoundation框架 1.2 AVFoundation 之 Assets 1.3 AVFo ...

  3. iOS】AVPlayer 播放音视频

    1.常见的音视频播放器 iOS开发中不可避免地会遇到音视频播放方面的需求. 常用的音频播放器有 AVAudioPlayer.AVPlayer 等.不同的是,AVAudioPlayer 只支持本地音频的 ...

  4. 流媒体开发(四)音视频的录制

    在前面几篇文章中,我们介绍了在iOS中如何实现音视频的播放,在本文中,我们将介绍一下在iOS中如何实现音视频的录制功能. 1. 音频录制 在AVFoundation框架中还要一个AVAudioReco ...

  5. iPhone开发之音视频的播放——MPMoviePlayerViewController和AVAutoPlayer的使用

    新建工程,添加音视频框架 编辑控制器的.h文件如下: <span style="font-size:18px;">// // ViewController.h // 音 ...

  6. 音视频封装格式、编码格式

    音视频封装格式.编码格式 概述 常见的AVI.RMVB.MKV.ASF.WMV.MP4.3GP.FLV等文件其实只能算是一种封装标准. 一个完整的视频文件是由音频和视频2部分组成的.H264.Xvid ...

  7. IOS音视频(四十三)AVFoundation 之 Audio Session

    IOS音视频(四十三)AVFoundation 之 Audio Session 1.音频会话概述 2. 配置音频会话 2.1 音频会话默认行为 2.2 配置音频会话 2.3 使用多路由类别扩展选项 2 ...

  8. 【iOS】AVPlayer 播放音视频

    1.常见的音视频播放器 iOS开发中不可避免地会遇到音视频播放方面的需求. 常用的音频播放器有 AVAudioPlayer.AVPlayer 等.不同的是,AVAudioPlayer 只支持本地音频的 ...

  9. IOS音视频(三)AVFoundation 播放和录音

    IOS音视频(三)AVFoundation 播放和录音 1. 音频理论知识 1.1 声音的物理性质 1.2 数字音频 1.2.1 采样.量化和编码 1.2.2 音频编码 1.3 音频编解码 2. 播放 ...

  10. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

最新文章

  1. Oracle数据库安装响应文件,1.2.6 步骤6:配置应答文件,然后运行安装程序(2)...
  2. 1044 拦截导弹——http://codevs.cn/problem/1044/
  3. 【NLP】Task3:特征选择
  4. [leetcode]27.移除元素
  5. vc设备工程师_4注册公用设备工程师专业基础考试真题.
  6. PTA 7-3 地铁一日游 (30 分)
  7. .NET Framework 如何:提高性能
  8. boost Mutex
  9. ASP.NET MVC 使用Log4Net在不同目录中记录不同类型的日志
  10. Dubbo(八)使用配置类方式实现服务提供者消费者dubbo配置
  11. 删除MyEclipse 6.5.1自带的Maven4MyEclipse
  12. Redis之Pipeline(管道)
  13. 教你查看传说中的WPS2005彩蛋
  14. VS2019删除空白行
  15. MongoDB快速学习
  16. rtsp 用户名、密码登录
  17. 无法建立与远程计算机连接,解决“不能建立到远程计算机的连接,因此用于此...”的方法_常见问题解析...
  18. 解决上手使用Colab、Kaggle时遇到的问题
  19. IDE for C++
  20. Codeforces Round #777 (Div. 2) (A-D题解)

热门文章

  1. python将xls转换为xlsx_python – 如何将xls转换为xlsx
  2. unsigned char code 是什么
  3. CF1153D Serval and Rooted Tree
  4. 实验吧 天网管理系统writeup
  5. vue项目 微信支付 和 支付宝支付
  6. 磊科路由器信号按键_超简单的磊科路由器重置方法
  7. 计算机合并单元格怎么操作,excel怎么合并单元格,教您excel合并单元格的方法
  8. 移动硬盘无法读取是怎么回事?
  9. 面向初学者的 Python IDE:Thonny,你值得一试
  10. 错误码:28,错误信息:没有足够的存储空间 解决方法