AVPlayer в UICollectionViewCell воспроизводит звук, но не показывает видео - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 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 без видео, с которым я сталкивался, не применялось.Если у кого-то есть понимание, оно будет высоко оценено.

Заранее спасибо.

1 Ответ

0 голосов
/ 01 июня 2018

У меня была очень похожая проблема.Попробуйте установить для рамки AVPlayerLayer значение CGRect() нужного размера после заполнения содержимого.Также вы можете сделать Dispatch.Queue асинхронный вызов для вашего didSet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...