从全屏返回后,AVPlayerViewController停止

时间:2016-12-25 20:56:13

标签: ios objective-c avplayer avplayerviewcontroller avplayeritem

我有一个AVPlayerViewController,我使用AVPlayer和一些AVPlayerItem初始化(iOS 10,Xcode 8,Objective C)。 AVPlayerViewController呈现"内联"在一些子视图中,一切都与本机播放控件完美配合。

当我按下原生全屏按钮时,它也可以正常工作并切换到全屏模式(左上角有完成按钮)。

我的问题是,当我按完成按钮从全屏返回时,播放器由于某种原因停止播放,重置自己,如果我选中.currentItem,我会看到它{{1} }。

这里发生了什么?为什么nil可以在从/切换到全屏之间保持AVPlayerViewController

3 个答案:

答案 0 :(得分:1)

根据上面的答案 https://stackoverflow.com/a/58818395/196555 和评论 AVPlayerViewController stops after returning from full screen

我发现如果您想知道 AVPlayerViewController 是否正在播放,可以使用此扩展程序

extension AVPlayer {
    var isPlaying: Bool {
        rate != 0 && error == nil
    }
}

 @objc func playerViewController(_ playerViewController: AVPlayerViewController, willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        let isPlaying = self.playerViewController.player?.isPlaying ?? false
        // The system pauses when returning from full screen, we need to 'resume' manually.
        coordinator.animate(alongsideTransition: nil) { _ in
            if isPlaying {
                self.playerViewController.player?.play()
            }
        }
    }

答案 1 :(得分:0)

使用@ matt的参考,我发现我做的不同之处在于设置AVPlayerViewController的{​​{1}}属性而没有player,并且之后只设置它(依赖于AVPlayerItem

换句话说 - 根据我的经验,您应该使用replaceCurrentItemWithPlayerItem()或任何AVPlayerViewController初始化AVPlayerURL,然后再添加AVPlayerItem }作为子视图控制器。

不使用AutoLayout的代码:

AVPlayerViewController

答案 2 :(得分:0)

由于看起来AVPlayerViewController的当前行为在退出全屏显示时会暂停,因此我们可以在退出时通过实现委托来调用play()

class VideoView {

    private var playerViewController: AVPlayerViewController?

    func something() {

        playerViewController = AVPlayerViewController()

        // Other setups

        playerViewController?.delegate = self
    }
}

extension VideoView: AVPlayerViewControllerDelegate {

    func playerViewController(_ playerViewController: AVPlayerViewController, willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {

        // The system pauses when returning from full screen, we need to 'resume' manually.
        coordinator.animate(alongsideTransition: nil) { transitionContext in
            self.playerViewController?.player.play()
        }
    }
}