运行和其他应用同时播放的实现原理

简介: 运行和其他应用同时播放的实现原理

在做音乐播放器的时候,一般需要写一个监听器来监听音频资源是否被抢占,比如当我们打开网易云播放音乐的时候,打开抖音,这时候就要求网易云音乐暂停播放,然后播放视频。一般需要写一个音频变化的监听器:OnAudioFocusChangeListener。当其他应用申请音频资源的方式不同时候我们做出相应的处理。


OnAudioFocusChangeListener:focusChange表示的是音频改变的模式,即抢占资源的应用的申请音频的方式,这里监听到音频的变化时候可以直接发送消息,利用handler异步处理播放器控件的状态和关闭播放器等操作,当用来修改notification的状态的时候,这时候可能播放器资源被回收(这取决于申请资源focusChange的方式),不能用notification.notify,需要重新创建notification


private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
       public void onAudioFocusChange(int focusChange)
   {
           if(focusChange == AudioManager.AUDIOFOCUS_GAIN )
             {        
                 ...
              }
           else if (focusChange =..)
              {
                 ...
              }
       }
   };    



  • AUDIOFOCUS_LOSS:失去了Audio Focus,并将会持续很长的时间。这里因为可能会停掉很长时间,所以不仅仅要停止Audio的播放,最好直接释放掉Media资源。而因为停止播放Audio的时间会很长,如果程序因为这个原因而失去AudioFocus,最好不要让它再次自动获得AudioFocus而继续播放,不然突然冒出来的声音会让用户感觉莫名其妙,感受很不好。这里直接放弃AudioFocus,当然也不用再侦听远程播放控制【如下面代码的处理】。要再次播放,除非用户再在界面上点击开始播放,才重新初始化Media,进行播放。


  • AUDIOFOCUS_LOSS_TRANSIENT:暂时失去Audio Focus,并会很快再次获得。必须停止Audio的播放,但是因为可能会很快再次获得AudioFocus,这里可以不释放Media资源;


AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:暂时失去AudioFocus,但是可以继续播放,不过要在降低音量。


AudioFocus的申请与释放


  获取/放弃AudioFocus的方法都在android.media.AudioManager中,获取AudioFocus用requestAudioFocus();用完之后,放弃AudioFocus,用abandonAudioFocus()


函数原型:

1、public int requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)


streamType:播放流类型 AudioStream,其值取决于AudioManager中的STREAM_xxx,


durationHint是持续性的指示:这个值对应于OnAudioFocusChangeListener中focusChange的方式 即值


AUDIOFOCUS_GAIN指示申请得到的Audio Focus不知道会持续多久,一般是长期占有;


AUDIOFOCUS_GAIN_TRANSIENT指示要申请的AudioFocus是暂时性的,会很快用完释放的;


AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK不但说要申请的AudioFocus是暂时性的,还指示当前正在使用AudioFocus的可以继续播放,只是要“duck”一下(降低音量)。


AudioManager.OnAudioFocusChangeListener是申请成功之后监听AudioFocus使用情况的Listener,后续如果有别的程序要竞争AudioFocus,都是通过这个Listener的onAudioFocusChange()方法来通知这个Audio Focus的使用者的。


2、 audioManager.abandonAudioFocus(OnAudioFocusChangeListener);


目录
相关文章
|
API 图形学
Unity设置播放模式下始终先执行指定的场景
通过我们使用Unity开发游戏,是在PC/Mac上。而一个游戏通常也会有很多的场景,比如A、B、C、D三个场景,正常流程下的执行顺序是 A –> B –> C –> D。在具体一点,比如 A —— 启动场景、B —— 资源加载场景、C —— 登录场景、D —— 战斗场景。
1798 0
|
6月前
|
C#
C#进程调用FFmpeg操作音视频
因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作。本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并、音频合并、音频与视频合并成视频这几个简单的音视频操作。
|
8月前
|
缓存
停止AVPlayer并在缓存阶段立即播放其它视频闪退问题及解决方案
停止AVPlayer并在缓存阶段立即播放其它视频闪退问题及解决方案
90 0
|
8月前
|
存储 算法 前端开发
深入理解FFmpeg音视频编程:处理封装、解码、播放 队列与回放策略
深入理解FFmpeg音视频编程:处理封装、解码、播放 队列与回放策略
337 0
|
8月前
|
Linux C++ iOS开发
VLC源码解析:视频播放速度控制背后的技术
VLC源码解析:视频播放速度控制背后的技术
653 0
|
8月前
|
JavaScript
uniapp计算视频学习进程,并且下次回来继续播放(不能快进)
uniapp计算视频学习进程,并且下次回来继续播放(不能快进)
234 0
播放视频时有残影、水纹的原因
播放视频时有残影、水纹的原因
189 0
关于线程的小应用(动态播放图片)以及通过小应用得出线程的一个好处
关于线程的小应用(动态播放图片)以及通过小应用得出线程的一个好处
121 0
关于线程的小应用(动态播放图片)以及通过小应用得出线程的一个好处
|
图形学
Unity 之 关于停止协程的五种方式解析
通过代码结合示例一一解析了五种停止协程的方式。
1724 0
Unity 之 关于停止协程的五种方式解析