两个或者两个以上的app可以同时向同一输出流播放音频。系统会将所有音频流混合在一起,但这样会给用户带来很大的困扰。为了避免所有音乐app同时播放,ios引入了“音频焦点”的概念。在ios中,音频焦点是操作系统为了管理音频硬件而引入的概念,是指app对音频硬件在时间维度上的使用控制(不是使用权限,使用权限需要app单独申请)。app可以独占使用,也可以共享使用音频焦点,即独占或者共享音频硬件。
独占音频焦点,指的是只能有一个app使用音频硬件,而共享音频焦点,指的是多个app可以同时使用音频硬件,共享音频焦点通常会导致多个app播放的音频被混音(即手机会同时发出多个音频的声音)。
当你的app需要输出音频时,你的app就需要得到音频焦点,获得音频焦点之后,就可以播放声音了。不过,在app获得音频焦点之后,也不一定能一直持有音频焦点,因为其它app也可能抢占音频焦点。如果你的app的音频焦点被其它app抢占了,那么你的app应该暂停播放视频或者音频。
我们先来看一个录屏(如下所示,注意录屏里面所播放的声音),当酷狗音乐在播放的时候,我们启动一个demo,然后点击如下图的黑色框的按钮(按钮文案是"AVAudioSessionCategorySoloAmbient(系统默认)“),会发现酷狗音乐不再播放了,此时我们再点击如下图的红色框中的按钮(按钮文案是"释放音频焦点,以便回复酷狗音乐的播放”),然后酷狗音乐就继续播放音乐了。
上面录屏的demo的实现代码如下面第1张图所示,黑色框的代码表示demo app要抢占ios系统的音频焦点。抢占音频焦点只需要分别调用AVAudioSession类的两个方法:
setCategory:error:方法的作用如下面第2张图所示,该方法用于告诉系统说本app要怎么使用音频。该方法的第1个参数的取值一共有7个,其中一个是AVAudioSessionCategorySoloAmbient,该值表示
打断其他不支持混音的APP的音频播放
。
而setActive:error:方法表示
申请获取或者释放ios系统的音频焦点,该方法的返回值表示是否已经成功获取或者释放音频焦点
。该方法的第1个参数为YES表示app要申请ios系统的音频焦点,而为NO表示app要释放ios系统的音频焦点。如下图所示,红色框的代码表示释放系统的音频焦点,AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation表示app释放音频焦点的时候,会给其它app发送“音频焦点已经释放了”的通知,而酷狗音乐app会接收该通知,并在收到该通知后恢复音乐的播放。
AVAudioSession是一个类,如下图所示,每个运行中的app都有一个AVAudioSession类的单例,系统通过协调每个运行中的app的AVAudioSession的单例来管理音频的行为。
在ios中,app的AVAudioSession实例对象的默认功能配置(app冷起的时候就默认会有的能力)有:
-
支持音频播放,但不支持录音;
-
把手机调到静音模式会把app“静音”。比如当app正在播放音乐或者视频时,把手机调到静音模式,此时手机就不会发出音乐或者视频的声音;
-
锁屏也会把手机调到静音模式会把app“静音”;
-
当app播放音频或者视频时,后台正在播放的音频会被“静音”,因为后台正在播放音频的那个app的音频焦点被“抢”了。
AVAudioSession实例对象提供的默认功能往往不足以满足视频类的app的需求,此时你可以通过配置AVAudioSession的category、mode和option来操作音频以便满足需求:
-
调用AVAudioSession的setActive:error:方法来申请获取或者释放ios系统的音频焦点;
-
通过调用AVAudioSession的setCategory:mode:options:error:方法来改变音频的行为,该方法需要和setActive:error:方法结合使用才能真正的改变音频的行为
-
监听音频相关的通知,比如监听音频播放过程中被打断、耳机插入或者拔出的通知
-
使用音频硬件的一些高级功能,比如设置采样率、I/O缓存时长
AVAudioSession支持的category配置一共有7种类型,如下两张图所示。
以上7种category已经能满足大部分的场景了,但如果还需要满足要求更加细致的场景,那就需要在category的基础上结合option和mode来使用。每种category都有自己的option和mode类型,所以option和mode是对category的补充(细化对category的配置)。比如,如果你的app使用了Playback类型的category,该类型有两种option可以配置(即是否支持混音,对应上图的第4行第3列的位置),其中一种option能让你的音频和后台播放的音频(比如后台上正在播放酷狗音乐)同时播放(具体的option是AVAudioSessionCategoryOptionMixWithOthers),而另一种option能让后台播放的音频停止“出声音”(默认就是这种,即默认不支持混音)。
注意
:如果你想要实现音频的后台播功能(具体是手机进入锁屏状态或者把app退到后台),就不仅需要把AudioSession的category设置为AVAudioSessionCategoryMultiRoute或者AVAudioSessionCategoryPlayAndRecord或者AVAudioSessionCategoryPlayback,还需要在info.list文件里面添加“Required background modes”这个选项,具体如下图的红框所示。否则的话当手机进入锁屏状态或者把app退到后台时,音频就会被“暂停”,此时你就听不到音频的声音了。
音频常见的通知如下:
-
AVAudioSessionInterruptionNotification:当你app的音频被打断时,系统就会发出该通知。比如,当你app在播放非静音状态的视频时,此时突然有电话打进来,视频的声音会消失,而电话的铃声会出现,并且系统会发送该通知。
-
AVAudioSessionRouteChangeNotification:当手机的音频相关的输入输出设备发生变化时,系统就会发出该通知。比如耳机的插入和拔出。
两个或者两个以上的app可以同时向同一输出流播放音频。系统会将所有音频流混合在一起,但这样会给用户带来很大的困扰。为了避免所有音乐app同时播放,ios引入了“音频焦点”的概念。在ios中,音频焦点是操作系统为了管理音频硬件而引入的概念,是指app对音频硬件在时间维度上的使用控制(不是使用权限,使用权限需要app单独申请)。app可以独占使用,也可以共享使用音频焦点,即独占或者共享音频硬件。
Android 系统保持相互独立的
音频
流通道来播放音乐,报警,通知,来电铃声,系统声音,呼叫(通话)音量,和 DTMF 音调(键盘拨号)。这样做主要是为了使用户能够独立地控制每个流的音量。
转载自:http://blog.csdn.net/u013754648/article/details/46663201
音频
焦点
,这两篇文章很好的解释了
音频
焦点
的由来,使用方法及注意事项,平时用到比较多,这里收藏了。
什么叫
音频
焦点
(audio focus)?
android系统是一个多任务操作系统,因此同一时刻允许许多任务同时工作。但是这对
音频
类应用来说是个挑战,因为如果多个
音频
同
原文地址:Understanding Audio Focus (Part 1 / 3): Common Audio Focus use cases
原文作者:Nazmul Idris (Naz)
译文出自:掘金翻译计划
本文永久链接:github.com/xitu/gold-m…
译者:oaosj
理解
音频
焦点
(第1/3部分):常见的
音频
焦点
用例
Android手机支持多个应用同时播放...
原文地址:Understanding Audio Focus (Part 2 / 3): More Audio Focus use cases
原文作者:Nazmul Idris (Naz)
译文出自:掘金翻译计划
本文永久链接:github.com/xitu/gold-m…
译者:oaosj本系列文章旨在让您深入理解
音频
焦点
的含义,使用方法和其对用户体验的重要性。本篇文章是该系列的第一部分,该...
AudioManager audioManager= (AudioManager) mActivity.getSystemService(Context.AUDIO_SERVICE);
audioManager.requestAudioFocus(null,AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);//请求焦
Android是多任务系统,Audio系统是竞争资源。在Android系统中允许多个应用同时播放
音频
,例如,我们在播放音乐的时候,点开了一个视频,如果音乐和视频声音混合在一起,这样就会让人不爽;如果,我们在听音乐的时候,收到信息,我们又希望能听到信息的提示音,可以让音乐的声音先降低,在结束音结束后再恢复音量。为了管理
音频
焦点
,Android引入
音频
焦点
(audio focus)这一特性。
这种机制是需要各个程序合作完成的,需要所有使用Audio资源的程序都按照这种机制来做,而如果有程序在它失去Au
音频
焦点
官方解读
两个或两个以上的 Android 应用可同时向同一输出流播放
音频
。系统会将所有
音频
流混合在一起。虽然这是一项出色的技术,但却会给用户带来很大的困扰。为了避免所有音乐应用同时播放,Android 引入了“
音频
焦点
”的概念。一次只能有一个应用获得
音频
焦点
。
当您的应用需要输出
音频
时,它需要请求获得
音频
焦点
,获得
焦点
后,就可以播放声音了。不过,在您获得
音频
焦点
后,您可能无法将其一直持有到播放完成。其他应用可以请求
焦点
,从而占有您持有的
音频
焦点
。如果发生这种情况,您的应用应暂停播放.
在目录packages/providers/MediaProvider/src/com/android/providers/media/RingtonePickerActivity.java中添加修改
import android.media.AudioManager
import android.content.Contxt;
import android.media.AudioManager
1、手机连接车机蓝牙,车机蓝牙音乐A2dpSink管理流程
A2dpSink在收到onPrepare或者请求播放音乐时,判断当前是否已
获取
到
焦点
,如果没有
获取
到
焦点
,则申请
焦点
。如果申请成功则更新avrcp状态信息,通知bluedroid
获取
到
焦点
,并保存已
获取
焦点
的状态。
如果手机端启动播放器播放音乐,即
音频
流start的时候,设置
音频
流可用。判断当前是否已经
获取
到
焦点
,如果没...