AVPlayerViewController 从全屏返回后停止

mll*_*llm 7 objective-c ios avplayer avplayeritem avplayerviewcontroller

我有一个AVPlayerViewController我用一个AVPlayer和一些AVPlayerItem(iOS 10,Xcode 8,Objective C)初始化的。将AVPlayerViewController呈现“内联”的一些子视图里面,一切都与本机播放控制完美的作品。

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

我的问题是当我按下完成按钮从全屏返回时,播放器出于某种原因停止播放,自行重置,如果我检查.currentItem,我看到它是nil.

这里发生了什么事?为什么不能在从/到全屏切换之间AVPlayerViewController保持它AVPlayerItem

bau*_*sic 10

由于看起来当前的行为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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些找到此问题和答案的人,请注意,它也可以稍微改进,因为上述解决方案将始终在退出全屏时播放视频,即使它已暂停。我通过扩展 AVPlayerViewController、覆盖 viewWillAppear(在 willEndFullScreen 之前退出时发生)并设置一个“pausedTemporarily”布尔值 objc_getAssociatedObject 来做到这一点,如果视频正在播放(基于 timeControlStatus),我会添加到扩展中。然后只需在 willEndFullScreen 中添加一个暂停临时检查,然后清除该值即可。效果很好! (2认同)
  • @NRitH 示例中没有子类化(除非我遗漏了一些东西)。`class VideoView` 不继承任何东西,扩展只是扩展 `VideoView`。当然,我很想看到一个更清洁的解决方案。我正在实现一个代表,仅此而已。 (2认同)