audio 类型及播放策略

  1. AudioFocus焦点异常

问题1:

1.问题描述

听筒收听语音信息的过程中来语音电话,语音消息声音不停止播放。

2.定位过程

正常流程:

1)播放语音消息,会首先requestAudioFocus同时进行音频焦点的监听,开始播放语音消息;

2)播放语音消息的过程中来语音电话,语音电话会去请求音频焦点;

根据log:

12-25 15:54:18.264  1039  1039 V AudioManager: requestAudioFocusForCall   streamType: 2  durationHint: 2

durationHint:2 对应音频焦点类型:AUDIOFOCUS_GAIN_TRANSIENT

3)此时,监听中的微信语音就会接受到相应的消息,失去焦点时进行相应的操作;失去音频焦点的事件类型与请求焦点的类型相对应,在此过程,收到的是AUDIOFOCUS_LOSS_TRANSIENT,微信语音暂时失去音频焦点,正常情况下,微信语音在收到这个消息时应该去暂停当前播放;

 微信语音之所以没有停止,应该是其收到LOSS的message并没有停止播放造成;

3.定位结论

 怀疑是微信从开始监听到最后响应事情的过程中出现了问题,由微信排查此问题原因。

 

涉及Audio概念

Stream类型:

 

为何有设置不同的Stream类型?

Android系统中,多个应用和系统都可能播放声音,但Android早期时音频输出设备很少,常见的Speaker、Earpiece、Headset、Bluetooth,后续版本根据芯片硬件支持度又增加HDMI、USB输出设备等。这样就会出现多个应用同时调用相同的输出设备的情况,比说播放音乐的同时要播放铃声/视频等,此时如何协调?

Android系统采用的两步处理该问题:

  1. 从软件上将音频流分成多种不同的类型;
  2. 设备输出时根据不同的音频流类型,选择不同的音频策略,根据不同的策略,选择不同的输出设备,这个过程就是音频的策略选择;

应用层可以通过提供给上层的API MediaPlayer中setAudioStreamType在播放前设置流类型,若没有设置,到Native层默认是AUDIO_STREAM_MUSIC;

厂商也可以根据需求增加相应的流类型,增加类型后策略需要做相应的调整;

AudioFocus类型:

Log中的durationHint是持续性标签:

  • AUDIOFOCUS_GAIN指示申请得到的Audio Focus不知道会持续多久,一般是长期占有;
  • AUDIOFOCUS_GAIN_TRANSIENT指示要申请的AudioFocus是暂时性的,会很快用完释放的;
  • AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE要申请的AudioFocus是暂时性的,但是是排他性的,一般用于录像之类的应用;
  • AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK要申请的AudioFocus是不仅暂时性的,还指示当前正在使用AudioFocus的可以继续播放,只是要“duck”一下(降低音量)。

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

AUDIOFOCUS_REQUEST_GRANTED:申请成功;

AUDIOFOCUS_REQUEST_FAILED:申请失败。

     与GAIN相对应的LOSS标签分别是:

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

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

·  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值