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-11-22 21:20:04

    WebView内存泄漏--解决方法小结

    Android混合开发时经常用到WebView加载html等页面,而WebView的内存泄漏就是最经常遇到的问题,尤其是当项目中需要用webview加载的页面比较多时。 即使当我退出页面时在我的BrowserActivity的onDestroy()方法中进行内存占用回收(如下图)但并没有效果:

  • 2018-11-23 09:19:27

    论索引的重要性

    我还有什么能说的呢,看来索引基本能解决一切慢sql。好开心。

  • 2018-11-26 17:03:59

    有些 where 条件会导致索引无效

    在查询中,WHERE 条件也是一个比较重要的因素,尽量少并且是合理的 where 条件是徆重要的,尽量在多个条件的时候,把会提取尽量少数据量的条件放在前 面,减少后一个 where 条件的查询时间。

  • 2018-11-26 17:05:47

    sql查询调优之where条件排序字段以及limit使用索引的奥秘

    看起来匪夷所思,其实搞清楚mysql查询的原理之后,其实很简单 我们来看这2条sql查询,都用到了where order by limit 当有limit存在时,查询的顺序就有可能发生变化,这时并不是从数据库中先通过where过滤再排序再limit 因为如果这样的话,从500万数据中通过where过滤就不会是5s了。

  • 2018-11-26 21:46:28

    TextView设置行间距、行高,以及字间距

    Android系统中TextView有默认行间距,但是比较窄有的时候需要我们设置每行行间距。 TextView为我们提供了相关设置属性android:lineSpacingExtra或android:lineSpacingMultiplier。

  • 2018-11-26 21:47:55

    Drawable一个有趣的属性:tileMode

    tileMode是drawable 资源文件 bitmap的一个属性, 翻译的意思是平铺模式。用法如下: 在drawable目录下新建一个资源文件 tile_mode_demo.xml