AVPlayer не играет

ios swift avplayer

1023 просмотра

1 ответ

3083 Репутация автора

В моем проекте я использую представление Kolada (здесь), чтобы представить стопку карт, каждая с видео на них. Иногда, когда я загружаю следующее видео, My AVPlayerне может воспроизвести видео, оно просто покажет первый кадр и будет заморожено. Я использую несколько наблюдателей, чтобы отслеживать, когда видео будет действительно воспроизводиться, если оно, вероятно, будет идти в ногу с воспроизведением. Могут ли наблюдатели остановить воспроизведение, если они не были должным образом освобождены? Если нет, что еще вызывает воспроизведение для AVPlayerостановки?

ОБНОВЛЕНИЕ: я заметил, что playbackLikelyToKeepUpэто никогда не вызывается иногда, и когда это происходит, AVPlayerто никогда не вызывает его снова, даже если я меняю предмет игрока. Таким образом, воспроизведение видео никогда не возобновляется.

 init(frame: CGRect, mediaURL: NSURL, thumbURL: NSURL?, isLoop: Bool) {
    self.mediaURL = mediaURL
    self.isLoop = isLoop

    let asset = AVAsset(URL: mediaURL)
    let item = AVPlayerItem(asset: asset)
    player = AVPlayer(playerItem: item)
    player!.actionAtItemEnd = .None

    super.init(frame: frame)

    asset.loadValuesAsynchronouslyForKeys(["duration"], completionHandler: { () -> Void in
        var error: NSError?
        let keyStatus: AVKeyValueStatus = asset.statusOfValueForKey("duration", error: &error)
        switch (keyStatus) {

        case .Loaded:
            let duration: CMTime = asset.duration
            self.currentDuration = duration
            self.delegate?.updateDuration()
        default:
            break
        }

    })

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: #selector(MediaPlayerView.playerItemDidReachEnd(_:)),
        name: AVPlayerItemDidPlayToEndTimeNotification,
        object: player!.currentItem)

    self.timeObserver = self.player!.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(1.0 / 30.0, Int32(NSEC_PER_SEC)), queue: nil, usingBlock: {
        [weak self] (time) -> Void in

        if time.value > 0 {
            self?.spinnerView?.stopAnimating()
            if(self?.player != nil){
                if(self?.player!.rate > 0){
                    self?.placeholderImageView?.hidden = true
                }
            }

            let timeInSeconds = CMTimeGetSeconds(time)
            self?.delegate?.playbackReachedTime(timeInSeconds)

        }
    })

    player!.currentItem?.addObserver(self, forKeyPath: playbackLikelyToKeepUp, options: .New, context: &observationContext)
    player!.addObserver(self, forKeyPath: "rate", options: .New, context: &observationContext)

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(MediaPlayerView.playerIsTapped(_:)))
    addGestureRecognizer(tapGesture)
}
Автор: Josh O'Connor Источник Размещён: 19.07.2016 01:10

Ответы (1)


3 плюса

1203 Репутация автора

Используйте replaceCurrentItemWithPlayerItem в существующем экземпляре объекта AVPlayer, установив значение nil для его уничтожения.

Автор: James Bush Размещён: 04.08.2016 02:33
Вопросы из категории :
32x32