当自己视频APP,遇到别人音频APP后台播放音频时候
Posted hherima
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当自己视频APP,遇到别人音频APP后台播放音频时候相关的知识,希望对你有一定的参考价值。
当别家音乐APP播放音乐,打开自家视频APP(虽然没有播放视频),但音乐app的音频却暂停了(如果是钉钉语音会议这种情况,会自动退出语音会议)。
查了资料:这是音频打断处理问题,举个例子:
第一种情况:比如闹铃打断的情况。先是AVAudiosessionInterruptionTypeBegan,闹铃结束调AVAudioSessionInterruptionTypeEnd,通知中的option是 AVAudioSessionInterruptionOptionShouldResume 可恢复。电话的中断也类似。
第二种情况:其他音乐APP正在播放,视频APP到前台也会收到系统的音频中断通知,但音乐app它是一直播放的。系统不可能等到它播放完再调xxxxend通知,所以会立即调用end,但通知中的option字段是0.
目前来看还是视频APP做一些操作,导致立即发送了AVAudioSessionInterruptionTypeEnd通知。果然,查阅代码后发现,视频APP有调用
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
这个意思就是不让其他音乐APP播放。所以视频APP会立即收到AVAudioSessionInterruptionTypeEnd通知。
这时候就要根据视频APP的状态和AVAudioSessionInterruptionOptionKey的值来处理逻辑了:
代码示例:
/**
* 处理音频打断
*/
-(void)AVAudioSessionInterruptionNotification:(NSNotification *)notif
NSDictionary *interruptionDictionary = [notif userInfo];
AVAudioSessionInterruptionType type =
[interruptionDictionary [AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
AVAudioSessionInterruptionOptions option = [interruptionDictionary [AVAudioSessionInterruptionOptionKey] unsignedIntegerValue];
switch (type)
case AVAudioSessionInterruptionTypeBegan:
if(如果当前不需要播放视频)//需要释放音频控制权
[[AVAudioSession sharedInstance] setActive:NO
withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation
error:nil];
break;
case AVAudioSessionInterruptionTypeEnded:
if (option == AVAudioSessionInterruptionOptionShouldResume)
if (正在播放视频)
//继续播放视频
//设置setactive
[[AVAudioSession sharedInstance] setActive:YES error:nil];
break;
default:
break;
注:
- AVAudioSessionCategoryAmbient : 只用于播放音乐时,并且可以和QQ音乐同时播放,比如玩游戏的时候还想听QQ音乐的歌,那么把游戏播放背景音就设置成这种类别。同时,当用户锁屏或者静音时也会随着静音,这种类别基本使用所有App的背景场景。
- AVAudioSessionCategorySoloAmbient: 也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是,用了它就别想听QQ音乐了,比如不希望QQ音乐干扰的App,类似节奏大师。同样当用户锁屏或者静音时也会随着静音,锁屏了就玩不了节奏大师了。
- AVAudioSessionCategoryPlayback: 如果锁屏了还想听声音怎么办?用这个类别,比如App本身就是播放器,同时当App播放时,其他类似QQ音乐就不能播放了。所以这种类别一般用于播放器类App
- AVAudioSessionCategoryRecord: 有了播放器,肯定要录音机,比如微信语音的录制,就要用到这个类别,既然要安静的录音,肯定不希望有QQ音乐了,所以其他播放声音会中断。想想微信语音的场景,就知道什么时候用他了。
- AVAudioSessionCategoryPlayAndRecord: 如果既想播放又想录制该用什么模式呢?比如VoIP,打电话这种场景,PlayAndRecord就是专门为这样的场景设计的 。
- AVAudioSessionCategoryMultiRoute: 想象一个DJ用的App,手机连着HDMI到扬声器播放当前的音乐,然后耳机里面播放下一曲,这种常人不理解的场景,这个类别可以支持多个设备输入输出。
- AVAudioSessionCategoryAudioProcessing: 主要用于音频格式处理,一般可以配合AudioUnit进行使用
了解了这七大类别,我们就可以根据自己的需要进行对应类别的设置了
参考:http://www.voycn.com/article/yinshipinkaifa-avaudiosessionzaikaifazhongdeyingyong
https://www.jianshu.com/p/1ce64fd142fa
http://www.voycn.com/article/yinshipinkaifa-avaudiosessionzaikaifazhongdeyingyong
https://www.jianshu.com/p/3e0a399380df
以上是关于当自己视频APP,遇到别人音频APP后台播放音频时候的主要内容,如果未能解决你的问题,请参考以下文章
MPMoviePlayerController iOS 播放音频文件问题