Я играю два разных локальных видео, используя два 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
}
}
}
}
}
})