ios后台播放视频

2021-01-24 10:08:57

参考地址 iOS AVPlayer之后台连续播放视频

很多开发者以为AVPlayer不能在后台播放视频:应用退到后台,但能播放视频的声音(ps:不是通过切换相同的音频来实现),我在开发SDK的过程中也遇到这个需求,所幸解决了这个问题。下面我就来讲讲实现的过程。

一 iOS和tvOS应用程序需要您启用某些后台操作的某些功能。 播放应用程序所需的常见功能是播放背景音频。 启用此功能后,当用户切换到其他应用或锁定iOS设备时,您的应用的音频可以继续。 此功能也需要在iOS中启用高级播放功能,如AirPlay流媒体和画中画播放功能。启用背景音频有两种方法: 1.在info.plist文件中添加Required background modes 如下图所示

屏幕快照 2017-09-11 上午9.45.19.png
2.工程Capabilities
屏幕快照 2017-09-11 上午10.12.49.png


二 AVPlayer的处理 如果AVPlayer的当前项目在设备的显示屏上显示视频 ,则当应用程序发送到后台时, AVPlayer播放将自动暂停。 有两种方法可以防止这种暂停: 1.禁用播放器项目中的视频轨道。这种方法仅适用本地文件,不可用于网络视频。

让playerItem = <#你的播放器项目#>  让tracks = playerItem.tracks  for trackItemTrack in tracks {  //查找视频轨道并禁用轨道  playerItemTrack.assetTrack.hasMediaCharacteristic(AVMediaCharacteristicVisual){   playerItemTrack.isEnabled = false }  } 复制代码

2.从相关的AVPlayer删除AVPlayer(将AVPlayerLayer player属性设置为nil)。这种方法不仅适用于本地视频,还适用于网络视频,重点推荐。 重要提示:这些更改必须在应用程序实际切换到后台之前生效。 否则AVPlayer将被暂停。 应用程序委托的applicationDidEnterBackground方法方便此目的。 如果禁用任何视频轨道,则当应用程序转换到前台或视频无法恢复播放时,必须重新启用这些视频轨道。 同样,您必须将任何AVPlayerLayer重新连接到AVPlayer 。 应用程序委托applicationDidBecomeActive方法方便此目的。

//已经进入后台

- (void)applicationDidEnterBackground:(UIApplication *)application {    LYAVPlayerView *playerView =[LYAVPlayerView sharedInstance];    [playerView.playerLayer setPlayer:nil]; } 复制代码

//已经激活

- (void)applicationDidBecomeActive:(UIApplication *)application {     LYAVPlayerView *playerView =[LYAVPlayerView sharedInstance];     AVPlayer *player =playerView.player;     [playerView.playerLayer setPlayer:player]; } 复制代码

播放完毕后接着在代理方法里播放下一个视频就可实现后台连续播放视频:

//播放完毕 - (void)videoPlayerDidReachEnd:(LYAVPlayerView *)playerView{           NSLog(@"播放完毕");          [self.playerView setURL:[NSURL URLWithString:VideoURL]];     [self.playerView play];      } 复制代码

GitHub源码



  • 2018-03-26 18:05:09

    MYSQL OR与AND一起 的用法

    查询结果是id = 2且age = 20或者id=1SELECT * from student WHERE id = 1 or id = 2 AND age = 20;12

  • 2018-03-27 11:27:09

    Java中Set集合的使用

    Set类继承了Conllection类,是一种集合类。Set的实现类有三个,下面我们会一一来说这些的不一样。

  • 2018-03-27 11:36:58

    Java中数组、List、Set互相转换

    需要注意的是, Arrays.asList() 返回一个受指定数组决定的固定大小的列表。所以不能做 add 、 remove等操作,否则会报错。

  • 2018-03-27 16:37:57

    Java 8 将List转换为Map

    几个Java 8示例来向您展示如何将一个List对象转换为一个Map,以及如何处理重复的键

  • 2018-03-31 09:37:33

    Android Sqlite查询优化之一---运用索引

    最近笔者在做聊天功能模块,发现当本地聊天数据记录过大,以10万行数据进行了检索测试,发现时间太长了,要6s左右,但学着运用了下索引,时间大大提升,紧要几百毫秒就能完成. 以下内容,摘抄至网络

  • 2018-04-02 10:50:59

    mybatis 中的<![CDATA[ ]]>

    在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]>来解决。

  • 2018-04-03 10:21:35

    jquery实时监听输入框值变化

    在做web开发时候很多时候都需要即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感。而采用onchange时间又往往是在输入框失去焦点(onblur)时候触发,有时候并不能满足条件。