Как воспроизвести два разных местных видео несколько раз в одном просмотре - PullRequest
0 голосов
/ 25 февраля 2019

Я играю два разных локальных видео, используя два AVPlayer объекта в одном представлении.И эти два видео будут воспроизводиться повторно с использованием уведомления AVPlayerItemDidPlayToEndTime.

@objc private func playerItemDidReachEnd() {
   if let player = assetPlayer {
       player.seek(to: kCMTimeZero)
       player.play()
   }
}

Теперь проблема заключается в AVPlayerItemDidPlayToEndTime уведомлении, вызывающем 4 раза, и после некоторого AVPlayerItemDidPlayToEndTime уведомления, вызывающего непрерывно (я предполагаю, что видео застряло в конце, поэтому оно вызывает уведомление непрерывно), это приводит ксбой моего приложения.

Вот мой код:

let options = [AVURLAssetPreferPreciseDurationAndTimingKey : true]
var urlAsset = AVURLAsset(url: url, options: options)
guard let asset = urlAsset else { return }
asset.loadValuesAsynchronously(forKeys: keys, completionHandler: {
            DispatchQueue.main.async {

      var error: NSError?
      let status: AVKeyValueStatus = asset.statusOfValue(forKey:"tracks",error: &error)

        if status == AVKeyValueStatus.loaded {
        assetDuration = CMTimeGetSeconds(asset.duration)

        let videoOutputOptions = [kCVPixelBufferPixelFormatTypeKey as String : Int(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)]
        videoOutput = AVPlayerItemVideoOutput(pixelBufferAttributes: videoOutputOptions)
        var playerItem = AVPlayerItem(asset: asset)

        if let item = playerItem {
            item.addObserver(self, forKeyPath: "status", options: .initial, context: videoContext)
            item.addObserver(self, forKeyPath: "loadedTimeRanges", options: [.new, .old], context: videoContext)



            NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd), name:  NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(didFailedToPlayToEnd), name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime, object: nil)

            if let output = videoOutput {
                item.add(output)

                item.audioTimePitchAlgorithm = AVAudioTimePitchAlgorithm.varispeed

                assetPlayer = AVPlayer(playerItem: item)


                if let player = assetPlayer {
                    player.rate = 1.0
                }
                if let playView = playerView, let layer = playView.layer as? AVPlayerLayer {
                    layer.player = assetPlayer
                }
            }
        }
    }
  }
})
...