本文转自:AVAudioSession(4):响应音频中断事件 | www.samirchen.com

本文内容主要来源于 Responding to Interruptions

当一个音频中断到来时,会关闭你的 Audio Session,这通常就意味着停止或暂停你的音频播放。产生中断通常是因为另一个和你的应用存在竞争性音频行为的应用此时被激活,而这个应用设置的 Category 不支持 mix 你的音频。正确的处理音频中断事件能够让你的应用提供给用户更好的体验。

当用户电话响起的时候,你的应用还会因中断而被挂起。当电话结束,你的应用才会被继续运行。这时你的 Audio Session 需要被重新激活。

音频中断处理技术

你可以通过监听音频中断相关的通知 AVAudioSessionInterruptionNotification 来处理中断事件。

当音频中断发生时,你应该做的事情大致如下:

  • 中断开始后

    • 1)保持状态和上下文;
    • 2)更新用户界面。
  • 中断结束后
    • 1)恢复状态和上下文;
    • 2)在应用准备好时激活 Audio Session;
    • 3)更新用户界面。

根据使用的音频技术不同,相应的处理中断的技术也会有所差别,大致如下:

  • AV Foundation framework:AVAudioPlayer 类和 AVAudioRecorder 类提供了中断开始和结束的 Delegate 回调方法来供你处理中断。你可以实现这些回调方法来在对应的时候更新你的用户界面,以及在中断结束后恢复播放。使用这两个类播放或录制音频,当发生中断时,系统会自动暂停播放或录制,在中断结束时,当你恢复播放或录制时,系统会自动激活你的 Audio Session。如果你想要在应用退出/启动时,记录/恢复播放位置,那么在发生中断时,你也要记得记录一下播放位置。

  • Audio Queue Services, I/O audio unit:这些技术需要你的应用自己来处理中断,你需要负责记录播放或录制的位置,以便在中断结束恢复 Audio Session 时用到。

  • OpenAL:当使用 OpenAL 播放时,你需要注册对应的通知事件来监听中断。并且你还需要自己管理 OpenAL 的上下文。

  • System Sound Services:使用 System Sound Services 播发音频,当中断发生时,音频播放会静音,当中断结束后,音频播放会恢复。你的应用则无法影响音频中断时的行为。

中断的生命周期

音频中断发生的过程大致如下图所示:

  • 1)你的应用正在运行,在播放音频。
  • 2)来了一个电话。系统激活电话应用的 Audio Session。
  • 3)系统关闭你的 Audio Session。这时,你的应用里的音频播放被停止了。
  • 4)系统调用你应用的中断监听回调方法,通知你:你的 Audio Session 已经被关闭了。
  • 5)你的回调方法做出合适的处理,比如:更新用户界面,保持当前状态信息和上下文以便于恢复播放时用。
  • 6)当用户解除中断,比如挂掉了电话,系统会调用你的回调方法,通知你:中断结束了。
  • 7)你的回调方法做出合适的处理,比如:更新用户界面,重新激活 Audio Session,恢复播放。
  • 8)如果在 6 中用户没有解除中断,比如接听了电话,系统会将你的应有挂起,当通话结束后,中断结束的消息会通知给你。

需要注意的是,有一个中断开始消息不一定会有一个中断结束消息,这就意味着你在中断结束的回调里的处理逻辑可能会没有被执行到。所以你的应用需要关注当切到前台运行状态时或者用户点击了播放按钮时,是不是需要重新激活你的 Audio Session,因为有可能这时候你的 Audio Session 还因为一次有开始通知没结束通知的中断给关闭着呢。

AVAudioSession(4):响应音频中断事件的更多相关文章

  1. 【转】iOS 音频-AVAudioSession

    1. AVAudioSession 概述 最近一年一直在做IPC Camera的iOS客户端开发.和音频打交道,必须要弄清楚 AVAudioSession. 先看下苹果的官方图:   Audio Se ...

  2. iOS音频掌柜-- AVAudioSession

    音频输出作为硬件资源,对于iOS系统来说是唯一的,那么要如何协调和各个App之间对这个稀缺的硬件持有关系呢? iOS给出的解决方案是"AVAudioSession" ,通过它可以实 ...

  3. iOS - AVAudioSession详解

    音频输出作为硬件资源,对于iOS系统来说是唯一的,那么要如何协调和各个App之间对这个稀缺的硬件持有关系呢? iOS给出的解决方案是"AVAudioSession" ,通过它可以实 ...

  4. 【转】解决在Android设备播放音频与其他应用重音的问题,并监听耳机的控制按钮

    概述 在安卓开发中免不了需要播放一点音乐了,音频了.但是这时候有别的应用正在播放,这时候就会出现重音的现象,完全影响用户体验,我们的项目就遇上了这样的尴尬,然后查找了一些文档,记录一下: 管理音频焦点 ...

  5. iOS- 关于AVAudioSession的使用——后台播放音乐

    1.前言 •AVAudioSession是一个单例,无需实例化即可直接使用.AVAudioSession在各种音频环境中起着非常重要的作用 •针对不同的音频应用场景,需要设置不同的音频会话分类   1 ...

  6. AVFoundation 框架初探究(一)

    夜深时动笔 前面一篇文章写了视频播放的几种基本的方式,算是给这个系列开了一个头,这里面最想说和探究的就是AVFoundation框架,很想把这个框架不敢说是完全理解,但至少想把它弄明白它里面到底有什么 ...

  7. AVAudioSesion和AVAudioPlayer的基本使用

    iOS基础篇-AVPLayer和AVAudioSession 2018.02.27 16:17 字数 215 阅读 1516评论 0喜欢 4 作用 AVPLayer:可以用来播放在线及本地音视频 AV ...

  8. EZ-USB FX2(68013)固件研究

    原始资料来自网络 整理日: 2015年2月12日 1. Welcome 算是给所有正在学习USB,还徘徊着不得其门而入的朋友一个入门的契机吧,我也深知入门的痛苦,有些人入门就是抱着那什么USB协议,包 ...

  9. OC-AVAudioSession的知识小记

    参考文章:https://www.cnblogs.com/junhuawang/p/7920989.html 音频输出作为硬件资源,对于iOS系统来说是唯一的,那么要如何协调和各个App之间对这个稀缺 ...

随机推荐

  1. MD5加密算法全解析

    转自:http://blog.csdn.net/nzfxx/article/details/51804193 大家好,我们现在来讲解关于加密方面的知识,说到加密我认为不得不提MD5,因为这是一种特殊的 ...

  2. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. Android 满屏显示自定义的View,并进行移动

    新建一个类,继承View package com.topcrab.mygame; import android.content.Context; import android.graphics.Bit ...

  4. easyui datagrid行内编辑

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. glibc-2.23_int_free_流程浅析

  6. linux日志自动分割shell

    随着服务器运行时间不断增加,各种日志文件也会不断的增长,虽然硬盘已经是白菜价了,但是如果当你看到你的一个日志文件达到数十G的时候是什么感想?下面的脚本实现了如下功能: 自动对日志文件进行分割 对分割后 ...

  7. 设计模式之Prototype模式

    通常我们会使用new 类名()的方法会去生成一个新的实例,但在开发过程中,有时候也会有"在不指定类名的前提下生成实例"的需求,那样,就只能根据现有实例来生成新的实例. 有三种情况, ...

  8. python的os模块命令

    https://www.cnblogs.com/weiyiming007/p/8493913.html

  9. Python3: Command not found(Mac OS)

    1. 第一步:查看以下路径是否安装有 Python 3.x # 打开以下目录, 版本号有可能不同 cd /usr/local/Cellar/python/3.5.2_3/bin # 查看当前目录的内容 ...

  10. virt-manager 操作 kvm虚拟机中鼠标不同步的问题

    在/etc/libvirt/qemu下找到对应的xml配置文件 在<devices>标签下添加 <input type='tablet' bus='usb'/>   然后 vi ...