我有一个AVPlayerViewController
,我使用AVPlayer
和一些AVPlayerItem
初始化(iOS 10,Xcode 8,Objective C)。
AVPlayerViewController
呈现"内联"在一些子视图中,一切都与本机播放控件完美配合。
当我按下原生全屏按钮时,它也可以正常工作并切换到全屏模式(左上角有完成按钮)。
我的问题是,当我按完成按钮从全屏返回时,播放器由于某种原因停止播放,重置自己,如果我选中.currentItem
,我会看到它{{1} }。
这里发生了什么?为什么nil
可以在从/切换到全屏之间保持AVPlayerViewController
?
答案 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
初始化AVPlayer
和URL
,然后再添加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()
}
}
}