以下是我在自定义视图中创建AVPlayerViewController的方法:
private func configureAVPlayer(completion: @escaping () -> ()) {
DispatchQueue.global(qos: .background).async {
self.avPlayer = AVPlayer()
self.avPlayerController = AVPlayerViewController()
guard self.avPlayer != nil && self.avPlayerController != nil else {
return
}
self.avPlayerController!.showsPlaybackControls = false
self.avPlayerController!.player = self.avPlayer!
self.avPlayerController!.videoGravity = AVLayerVideoGravity.resizeAspectFill.rawValue
self.avPlayerController!.view.clipsToBounds = true
self.avPlayerController!.view.layer.cornerRadius = 10.0
DispatchQueue.main.async(execute: {
self.avPlayerController!.view.frame = self.imageView.frame
self.mediaView.addSubview(self.avPlayerController!.view)
self.mediaView.sendSubview(toBack: self.avPlayerController!.view)
self.parentController.addChildViewController(self.avPlayerController!)
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.avPlayer!.currentItem, queue: .main) { _ in
print("Replaying")
self.avPlayer?.seek(to: kCMTimeZero)
self.avPlayer?.play()
}
completion()
})
}
}
当我的视图消失时,我想删除我的AVPlayerViewController及其观察者,所以我使用:
override func removeFromSuperview() {
avPlayerController?.player?.pause()
avPlayerController?.view.removeFromSuperview()
avPlayerController?.removeFromParentViewController()
avPlayerController = nil
NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: self.avPlayer!.currentItem)
}
但是,下次我创建此视图并调用configureAVPlayer
时,我的观察者的完成会被调用两次,我会听到两次视频的音频,也就是两次视频播放。
我没有正确移除观察者吗?