У меня есть UICollectionViewController с полноэкранными ячейками, которые прокручиваются по горизонтали.Внутри каждой ячейки есть другой collectionView, который прокручивается вертикально.В ячейке заголовка collectionView есть AVPlayer, извлекающий видео из URL.В настоящее время воспроизводится только аудио, но видео нет.
Приведенные ниже настройки AVPlayer и наблюдатели имеют тот же код, который я использовал много раз в приложении вне UICollectionViewCell без проблем.Размер кадра проигрывателя проверяется, и звук воспроизводится и зацикливается, как и ожидалось, поэтому наблюдатели, кажется, запускаются должным образом.
Соответствующий код:
var post: Post! {
didSet {
videoURL = URL(string: post.videoURL)
setupVideoObservers()
}
}
var videoURL: URL! {
didSet {
videoPlayer = AVPlayer(url: videoURL!)
}
}
@objc dynamic var videoPlayer: AVPlayer!
var videoPlayerLayer: AVPlayerLayer!
let videoContainerView = UIView()
override init(frame: CGRect) {
super.init(frame: frame)
setupCell()
}
func setupCell() {
addSubview(videoContainerView)
videoContainerView.anchor(top: topAnchor,
right: rightAnchor,
bottom: bottomAnchor,
left: leftAnchor)
videoPlayerLayer = AVPlayerLayer(player: videoPlayer)
videoPlayerLayer.frame = frame
videoPlayerLayer.videoGravity = .resizeAspectFill
videoContainerView.layer.addSublayer(videoPlayerLayer)
}
func setupVideoObservers() {
addObserver(self, forKeyPath: "videoPlayer.currentItem.status", options: .new, context: nil)
NotificationCenter.default.addObserver(self, selector: #selector(playerReachedEndOfVideo(notification:)), name: .AVPlayerItemDidPlayToEndTime, object: videoPlayer.currentItem)
NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForegroundNotification), name: .UIApplicationWillEnterForeground, object: videoPlayer.currentItem)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "videoPlayer.currentItem.status" {
videoPlayer.play()
}
}
@objc func playerReachedEndOfVideo(notification: NSNotification) {
let seekTime = CMTime(seconds: 0, preferredTimescale: 1000)
videoPlayer.seek(to: seekTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
videoPlayer.play()
}
@objc func appWillEnterForegroundNotification() {
videoPlayer.play()
}
Все другие решения проблем SOаудио AVPlayer без видео, с которым я сталкивался, не применялось.Если у кого-то есть понимание, оно будет высоко оценено.
Заранее спасибо.