Как продолжить воспроизведение видео в качестве слоя VideoView с помощью AVClayer, когда приложение быстро переходит в фоновый режим

Я воспроизводю видео в видеопросмотре с помощью AVPLayer, но когда приложение переходит в фоновый режим и снова открывает приложение, видео приостанавливается.

func playVideo() {

    if let filePath = Bundle.main.path(forResource: "Audios/copy1", ofType:"mp4") {

        let filePathUrl = NSURL.fileURL(withPath: filePath)

        videoPlayer = AVPlayer(url: filePathUrl)

        let playerLayer = AVPlayerLayer(player: videoPlayer)

        playerLayer.frame = self.videoView.bounds
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.videoPlayer?.currentItem, queue: nil) { (_) in
            self.videoPlayer?.seek(to: kCMTimeZero)
            self.videoPlayer?.play()
            self.videoPlayer.rate = 0.5
            self.videoPlayer.actionAtItemEnd = .none
        }

        self.videoView.layer.addSublayer(playerLayer)
        videoPlayer?.play()
    }
}

person Umair Shams    schedule 07.08.2018    source источник


Ответы (1)


Да, это возможно, но вы должны настроить все правильно.

  1. Вы должны правильно настроить AVAudioSession
  2. Отключите AVPlayer от презентации при переходе в фоновый режим.

Для первого пункта вы должны включить звуковой фоновый режим и настроить аудиосессию:

    do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            let _ = try AVAudioSession.sharedInstance().setActive(true)
        } catch let error as NSError {
            print("an error occurred when audio session category.\n \(error)")
        }

Для второго:

func applicationDidEnterBackground(_ application: UIApplication) {

    // Disconnect the AVPlayer from the presentation when entering background

    // If presenting video with AVPlayerViewController
    playerViewController.player = nil

    // If presenting video with AVPlayerLayer
    playerLayer.player = nil
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // Reconnect the AVPlayer to the presentation when returning to foreground

    // If presenting video with AVPlayerViewController
    playerViewController.player = player

    // If presenting video with AVPlayerLayer
    playerLayer.player = player
}

Для получения дополнительной информации см. эти документы:
link1
ссылка2
link3

person Andrea    schedule 07.08.2018