Проблема при попытке зациклить AVPlayer (userCapturedVideo) без проблем - PullRequest
0 голосов
/ 11 декабря 2018

Я некоторое время искал, как правильно это сделать.Я посмотрел здесь и здесь .И воспользовался верхним ответом здесь , чтобы попытаться выполнить это, однако для меня записанное видео даже не начинает зацикливаться.Первый кадр отображается, но не воспроизводит видео, поэтому мне интересно, что не так.

    func playRecordedVideo(video: URL) {
    thumbImage = nil
    playerQueue = AVQueuePlayer(playerItem: AVPlayerItem(url: video))

    playerLayer = AVPlayerLayer(player: playerQueue)
    playerLayer.frame = (camBaseLayer?.bounds)!
    playerLayer?.layoutIfNeeded()
    playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
    playerLayer.isHidden = false

    camBaseLayer?.layer.insertSublayer(playerLayer, above: previewLayer)

    playerItem1 = AVPlayerItem(url: video)

    playerLooper = AVPlayerLooper(player: playerQueue, templateItem: playerItem1)
    self.playerQueue?.play()
}

В приведенной выше функции я попытался выполнить следующее:

        var num = 0
    if num == 0 {
        self.playerQueue?.play()
        num+=1
    } else {
        NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.playerQueue.currentItem, queue: nil, using: { (_) in
            DispatchQueue.main.async {
                self.playerQueue.seek(to: CMTime.zero)
                self.playerQueue.play()
            }
        })

    }

Однако это только приводит к тому, что видео даже не воспроизводится, когда оно появляется.

цель состоит в том, чтобы предотвратить "пробел", который вы видите при зацикливании видео

Обновление :

Хорошо, так что фактически переменная num должна быть вне функции, которая затемзаставить код NS работать, но это приводит к зависанию представления, как это было раньше.

Обновление 2:

Мне пока не удалось найти решение этой проблемы.Но то, что наверняка, это то, что

`            NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.playerQueue.currentItem, queue: nil, using: { (_) in
                DispatchQueue.main.async {
                    self.playerQueue.seek(to: CMTime.zero)
                    self.playerQueue.play()
                }
            })

`Вызывает видео даже не зацикливаться.Любая причина, почему это происходит?

1 Ответ

0 голосов
/ 24 декабря 2018

Я сделал то же самое несколько лет назад, используя этот фрагмент кода:

var player: AVPlayer!
var playerLayer: AVPlayerLayer!

private func playVideo(name: String) {
    guard let path = Bundle.main.path(forResource: name, ofType:"mp4") else { return }
    player = AVPlayer(url: NSURL(fileURLWithPath: path) as URL)
    playerLayer = AVPlayerLayer(player: player)
    self.playerLayer.frame = SOME_BOUNDS
    self.player!.play()
    NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying(note:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
}

@objc func playerDidFinishPlaying(note: NSNotification) {
    print("Video Finished")
    self.playerLayer.removeFromSuperlayer()
    playVideo(name: "SOME_NAME")
}

Надеюсь, это указывает на желаемую функциональность

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