用户点击了播放视频,但是此时手机是静音状态,产品说静音状态下也需要把声音给播放出来,so~ 原文: https://www.jianshu.com/p/998709165dfd

首先你要确保player的属性muted为NO,即非静音,当然NO是系统默认的。然后设置一下category即可

//静音状态下播放
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

AVAudioSessionCategory是一个字符串枚举,讲一下几个常用的category的含义:

// app的声音可与其它app共存,但锁屏和静音模式会被静音,除非当前app是唯一播放的app
AVAudioSessionCategoryAmbient// 会停止其他程序的音频播放。当设备被设置为静音模式,音频会随之静音
AVAudioSessionCategorySoloAmbient // 仅用来录音,无法播放音频
AVAudioSessionCategoryRecord// 会停止其它音频播放,并且能在后台播放,锁屏和静音模式都能播放声音
AVAudioSessionCategoryPlayback // 能播也能录,播放默认声音是从听筒出来
AVAudioSessionCategoryPlayAndRecord

上面提到的静音模式,指的是点击了iPhone手机上的静音按钮(静音按钮在AssistiveTouch,就是屏幕上的虚拟home键中比较容易找到),并不是指慢慢慢慢地降低声音直到静音,那不是静音模式,只是声音降到了0而已

AVAudioSessionCategoryPlayAndRecord 有个小坑, 默认是听筒的声音,需要在设置下输出端口

- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError * _Nullable *)outError;

其中portOverride参数有2个可选参数:

AVAudioSessionPortOverrideNone:我的理解是将音频输出设置听筒,系统默认应该就是听筒,因为官方文档给出的解释是:

AVAudioSessionPortOverrideSpeaker:音频输出设置为扬声器。

3.App占用听筒或扬声器

由于你的APP使用音频通道时其他App可能正在使用它,所以需要调用这个方法。

- (BOOL)setActive:(BOOL)active error:(NSError * _Nullable *)outError;

使用方法:

//拿到AVAudioSession的单例对象
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; //设置为听筒模式
//[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:nil];//设置为公放模式
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];//让我的App占用听筒或扬声器[audioSession setActive:YES error:nil];

https://www.jianshu.com/p/47c7144db817 , 后台播放音乐,耳机控制,锁屏显示音乐信息,https://www.jianshu.com/p/771b45e53619

平时经常用到头条来看新闻和视频,如果后台还在播放着音乐,在播放视频的时候,音乐会被中断,视频播放结束或者退出页面,音乐就会再次响起,很好奇这是怎么做到的,今天看到了.

其它App播放声音打断

如果用户当时在后台听音乐,如QQ音乐,或者喜马拉雅这些App,这个时候播放视频后,其会被我们打断,当我们不再播放视频的时候,自然需要继续这些后台声音的播放。

首先,我们需要先向设备注册激活声音打断AudioSessionSetActive(YES);,当然我们也可以通过 [AVAudioSession sharedInstance].otherAudioPlaying;这个方法来判断还有没有其它业务的声音在播放。 当我们播放完视频后,需要恢复其它业务或App的声音,这时我们可以调用如下方法:

    // AVplayer初始化的时候记录下是否有别的播放器在播放if ([AVAudioSession sharedInstance].isOtherAudioPlaying) {NSLog(@"当前有其他播放器在播放!!");}// 如果有别的播放器,在用户暂停或者退出页面,恢复其他播放器的播放NSError *error =nil;BOOL isSuccess = [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];if (!isSuccess) {NSLog(@"__%@",error);}else{NSLog(@"成功播放了后台音乐");}

当有打电话,闹铃等其他的事件导致了播放暂停

//中断的通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];//中断事件
- (void)handleInterruption:(NSNotification *)notification{NSDictionary *info = notification.userInfo;//一个中断状态类型AVAudioSessionInterruptionType type =[info[AVAudioSessionInterruptionTypeKey] integerValue];//判断开始中断还是中断已经结束if (type == AVAudioSessionInterruptionTypeBegan) {//停止播放[self.player pause];}else {//如果中断结束会附带一个KEY值,表明是否应该恢复音频AVAudioSessionInterruptionOptions options =[info[AVAudioSessionInterruptionOptionKey] integerValue];if (options == AVAudioSessionInterruptionOptionShouldResume) {//恢复播放[self.player play];}}}

在用户插入和拔出耳机时,导致视频暂停,解决方法如下

//耳机插入和拔掉通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];//耳机插入、拔出事件
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification {NSDictionary *interuptionDict = notification.userInfo;NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];switch (routeChangeReason) {case AVAudioSessionRouteChangeReasonNewDeviceAvailable:break;case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:{//判断为耳机接口AVAudioSessionRouteDescription *previousRoute =interuptionDict[AVAudioSessionRouteChangePreviousRouteKey];AVAudioSessionPortDescription *previousOutput =previousRoute.outputs[0];NSString *portType =previousOutput.portType;if ([portType isEqualToString:AVAudioSessionPortHeadphones]) {// 拔掉耳机继续播放if (self.playing) {[self.player play];}}}break;case AVAudioSessionRouteChangeReasonCategoryChange:// called at start - also when other audio wants to playbreak;}
}

正常情况下,音频退到后台继续播放需要这么做.申请后台运行权限

-(void)applicationWillResignActive:(UIApplication *)application{//开启后台处理多媒体事件AVAudioSession *session=[AVAudioSession sharedInstance];[session setActive:YES error:nil];//后台播放[session setCategory:AVAudioSessionCategoryPlayback error:nil];}

但是我在前面做了静音状态下播放,[AVAudioSession sharedInstance]的Category已经是AVAudioSessionCategoryPlayback,所以在applicationWillResignActive就可以不用写了.

对了,还有一个小坑,就是AVPlayer光这么设置是不行的, 这个是针对音频的,视频的话,需要在applicationDidEnterBackground把AVPlayer的AVPlayerLayer设置为nil , 如果AVPlayerLayer还存在的话 , 是不能进行后台播放的. 同理,applicationWillEnterForeground需要在把AVPlayerLayer与AVPlayer关联起来.

iOS AVPlayer的一些定制相关推荐

  1. iOS AVPlayer视频播放器

    代码地址如下: http://www.demodashi.com/demo/11168.html 一.运行效果 二.实现过程 ①.创建播放器avPlayer //创建播放器url = [url str ...

  2. android ios av tv,iOS AVPlayer 实现后台连续播放视频

    最近接到一个需求,需要做一个在后台播放视频的功能.折腾了一下,最后总算完成了.因此写一篇文章,介绍下具体的实现步骤,也说说自己遇到的坑,算是总结和记录. 前言 当 App 退到后台时,会进入 susp ...

  3. IOS AVPlayer无法播放H265编码格式的MP4视频

    具体现象 使用 IOS 的 AVPlayer 播放 H265编码格式的mp4视频时,只有声音无图像. 原因 H265即 HEVC,在打包成mp4时需要有 codec tag.hev1 or hvc1是 ...

  4. iOS AVPlayer 与 AVPlayerViewController

    iOS 媒体功能主要的类 AVPlayer 全功能影音播放器 AVPlayerLayer 主要用于显示视频 AVPlayerViewController 提供了默认的可视化控制界面 一. AVPlay ...

  5. iOS AVPlayer的使用

    AVPlayer 在iOS开发中,播放视频通常有两种方式,一种是使用MPMoviePlayerController(需要导入MediaPlayer.Framework),还有一种是使用AVPlayer ...

  6. iOS AVPlayer和AVPlayerViewController

    1. AVPlayer AVPlayer是iOS常见的播放器,使用时需导入 #import <AVKit/AVKit.h> AVPlayer能控制播放器的播放,暂停,播放速度 // 初始化 ...

  7. iOS AVPlayer 简单应用

    //1 AVPlayerViewController *avvc = [[AVPlayerViewController alloc] init]; //2 avvc.player = [[AVPlay ...

  8. iOS AVplayer 基本使用方法

    *说明:利用AVPlayer可以制作视频播放器.音频播放器:使用AVPlayer播放过的格式有 .mp4  .m3u8   .mp3 1.创建播放器: _player = [[AVPlayer all ...

  9. iOS - AVPlayer播放视频,获取视频尺寸(宽高)

    公司启动页要求播放视频,其实很简单,AVPlayer可以胜任此任务. - (void)playVideoWithType:(NSString *)type {//获取视频sizeNSURL *medi ...

最新文章

  1. solr 3.5 配置及服务器设置
  2. Java培训进阶书籍推荐,赶快收藏起来!
  3. mysql中varchar 大小写敏感问题
  4. Dev GridView 绑定Listlt;Tgt;、BindingList lt;Tgt;、BindingSource
  5. burp suite 二级域名扫描插件
  6. 设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70)进行一趟归并后的结果为
  7. 云服务器 ECS > 安全 > 安全组 > 添加安全组规则
  8. ASP.NET服务器控件对应的HTML标签
  9. jtree和mysql_让JTree所有节点展开和关闭的类 - 我爱看火影的日志 - 网易博客
  10. nginx 配置参数说明
  11. 基于51单片机简易计算器LCD1602显示
  12. JTT 808-2019 道路运输车辆卫星定位系统 终端通讯协议及数据格式.PDF
  13. 苹果x和xsmax有什么区别_苹果手机OLED屏幕与LCD屏幕有什么区别
  14. 最有效地戒掉晚睡强迫症(熬夜强迫症、假象失眠症等等)
  15. kubernetes中容器(pod)间的通信及环境变量设置
  16. html5 实心圆点,html5使用canvas画空心圆与实心圆
  17. 用OneDrive生成音乐外链和图片外链
  18. HDU 6078 Wavel Sequence (dp)
  19. Spring Boot 学习[四] web项目实战训练(增删改查,分页,排序)
  20. spark 相关性分析_基本统计 - correlations(相关性系数) - 《spark机器学习算法研究和源码分析》 - 书栈网 · BookStack...

热门文章

  1. chinaren校友录的永久xss漏洞
  2. endnote下载的文献导入到Jabref
  3. 朝韩网战疑云,国家型黑客再掀波澜
  4. 其实一切与游戏无关--yy笔录+转载网络游戏服务器设计
  5. c语言 random函数,c++中的RANDOM()函数怎么使用?
  6. Spring源码——ClassPathXmlApplicationContext流程
  7. JACK的需求(一)【 测试用例】
  8. 写给那些正在找工作的朋友
  9. 工作简历项目经历阐述
  10. 暂停基于maplefetion的飞信客户端开发