在 iOS 11 上滑动时 AVPlayerViewController 黑屏
AVPlayerViewController black screen when swiping on iOS 11
我正在使用 AVPlayerViewController
在 iPad-App 上播放视频文件(H.264、AAC、MP4-Container)。
在 iOS 10 中一切正常。而且在 iOS 11 中它可以正确播放视频。
但在 iOS11 中,当我开始向任何方向滑动时,它会立即使视频变黑并静音。它还在底部的时间线旁边显示了一个加载指示器。
它还会忽略 allowsPictureInPicturePlayback
属性,因此它不会在 iOS 11.
上显示画中画按钮
这是我使用的代码:
avPlayerController = AVPlayerViewController()
avPlayerController?.showsPlaybackControls = true
avPlayerController?.allowsPictureInPicturePlayback = true
avPlayerController?.player = AVPlayer(url: videoUrl as URL)
avPlayerController?.player?.play()
self.present(self.avPlayerController!, animated: true, completion: nil)
avPlayerController?.player?.actionAtItemEnd = AVPlayerActionAtItemEnd.none
NotificationCenter.default.addObserver(self, selector: #selector(onVideoCompleted), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.avPlayerController!.player?.currentItem)
而这个函数在视频结束时关闭视频播放器:
func onVideoCompleted(notification:Notification) {
self.avPlayerController?.player = nil
self.avPlayerController?.dismiss(animated: true, completion: nil)
}
当屏幕黑屏时,我在控制台中得到了这个:
AVOutputDeviceDiscoverySession (FigRouteDiscoverer)
>>>> -[AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl
outputDeviceDiscoverySessionDidChangeDiscoveryMode:]: Setting device discovery
mode to DiscoveryMode_Presence (client: MyAppName)
好的,我发现错误了:
要在按下 "Done" 时关闭 Airplay 视频播放,我使用了以下代码:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if avPlayerController?.isBeingDismissed ?? false {
avPlayerController?.player = nil
}
}
但在 iOS11 中,Apple 添加了一项功能,可通过滑动手势关闭视频播放器。因此,当我滑动时,会调用 viewWillAppear
函数。
将此代码放入 viewDidAppear
修复了此问题并保留了 AirPlay-Fix。
我正在使用 AVPlayerViewController
在 iPad-App 上播放视频文件(H.264、AAC、MP4-Container)。
在 iOS 10 中一切正常。而且在 iOS 11 中它可以正确播放视频。
但在 iOS11 中,当我开始向任何方向滑动时,它会立即使视频变黑并静音。它还在底部的时间线旁边显示了一个加载指示器。
它还会忽略 allowsPictureInPicturePlayback
属性,因此它不会在 iOS 11.
这是我使用的代码:
avPlayerController = AVPlayerViewController()
avPlayerController?.showsPlaybackControls = true
avPlayerController?.allowsPictureInPicturePlayback = true
avPlayerController?.player = AVPlayer(url: videoUrl as URL)
avPlayerController?.player?.play()
self.present(self.avPlayerController!, animated: true, completion: nil)
avPlayerController?.player?.actionAtItemEnd = AVPlayerActionAtItemEnd.none
NotificationCenter.default.addObserver(self, selector: #selector(onVideoCompleted), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.avPlayerController!.player?.currentItem)
而这个函数在视频结束时关闭视频播放器:
func onVideoCompleted(notification:Notification) {
self.avPlayerController?.player = nil
self.avPlayerController?.dismiss(animated: true, completion: nil)
}
当屏幕黑屏时,我在控制台中得到了这个:
AVOutputDeviceDiscoverySession (FigRouteDiscoverer)
>>>> -[AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl
outputDeviceDiscoverySessionDidChangeDiscoveryMode:]: Setting device discovery
mode to DiscoveryMode_Presence (client: MyAppName)
好的,我发现错误了: 要在按下 "Done" 时关闭 Airplay 视频播放,我使用了以下代码:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if avPlayerController?.isBeingDismissed ?? false {
avPlayerController?.player = nil
}
}
但在 iOS11 中,Apple 添加了一项功能,可通过滑动手势关闭视频播放器。因此,当我滑动时,会调用 viewWillAppear
函数。
将此代码放入 viewDidAppear
修复了此问题并保留了 AirPlay-Fix。