«Недостатком» этого метода является то, что видео перезапускается каждый раз, когда вы переходите с фона на передний план. Это то, что было приемлемо в моем случае, но не может быть в вашем. Это потому, что AVLayer удаляется, когда вы переходите на задний план, и я помещаю новый AVLayer в videoView каждый раз, когда вы выходите на передний план. Удаление старого AVLayer было основополагающим для предотвращения ошибки моментального снимка рендеринга, другими словами, преодоления «зависания».
я есть видео, воспроизводимое в цикле на странице входа в мое приложение. Я следовал этому уроку Youtube, чтобы заставить его работатьЦикл видео в контроллере представления
Проблема в том, что когда приложение переходит в фоновый режим, если я не вернусь сразу же, когда я вернусь, видео будет заморожено.
СогласноApple Docs это должно произойти.
Я пытался использовать центр уведомленийNotification.Name.UIApplicationWillResignActive
но это не сработало.
Как заставить видео продолжать проигрываться, когда приложение возвращается из фона?
var player: AVPlayer!
var playerLayer: AVPlayerLayer!
override func viewDidLoad() {
super.viewDidLoad()
configurePlayer()
}
@objc fileprivate func configurePlayer(){
let url = Bundle.main.url(forResource: "myVideo", withExtension: ".mov")
player = AVPlayer.init(url: url!)
playerLayer = AVPlayerLayer(player: player!)
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
playerLayer.frame = view.layer.frame
player.actionAtItemEnd = AVPlayerActionAtItemEnd.none
player.play()
view.layer.insertSublayer(playerLayer, at: 0)
NotificationCenter.default.addObserver(self, selector: #selector(playerItemReachedEnd), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
NotificationCenter.default.addObserver(self, selector: #selector(playerItemReachedEnd), name: Notification.Name.UIApplicationWillResignActive, object: player.currentItem)
}
@objc fileprivate func playerItemReachedEnd(){
player.seek(to: kCMTimeZero)
}