在Loop,AVQueuePlayer iOS Swift中播放播放列表中的视频播放列表和单个视频剪辑

时间:2019-05-27 10:27:33

标签: ios swift video avplayeritem avqueueplayer

我正在尝试循环播放视频播放列表,并且还使用AVPlayerItem在AVQueuePlayer中循环播放播放列表中的单个视频片段,但是我无法找到以下相同的解决方案,这是到目前为止我尝试过的代码

常规

var player : AVQueuePlayer?
var playerLayer: AVPlayerLayer?
var playerItem: [AVPlayerItem] = []

func playAtIndex(index:Int){
        for i in index ..< playerItem.count {
            let obj = playerItem[i]
            if (self.player?.canInsert(obj, after: nil))! {
                obj.seek(to: .zero, completionHandler: nil)
                self.player?.insert(obj, after: nil)
                }
        }
    }

初始化视频播放器

self.player = AVQueuePlayer.init(items: self.playerItem)
self.playerLayer = AVPlayerLayer(player: self.player)
self.playerLayer?.frame = self.view!.bounds
self.playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspect
self.view!.layer.addSublayer(self.playerLayer!)
self.player?.play()
到目前为止,

用于循环播放列表的代码已经完成,但是可以正常播放,但是循环中的某些视频有时无法播放。

self.playAtIndex(index: 0)

已完成用于在播放列表中循环播放单个视频剪辑的代码,但无效

let playerItem: AVPlayerItem = note.object as! AVPlayerItem // here we get current item 
playerItem.seek(to: CMTime.zero, completionHandler: nil)
self.player?.play()

任何帮助都会很棒。!

1 个答案:

答案 0 :(得分:0)

要在playerItems中循环AVQueuePlayer,您需要在observer-notification

中添加AVPlayerItemDidPlayToEndTimeNotification
  

该项目播放到结束时间时发布的通知。

NotificationCenter.default.addObserver(self, selector: #selector(playerEndedPlaying), name: Notification.Name("AVPlayerItemDidPlayToEndTimeNotification"), object: nil)

每次触发playerEndedPlaying(_:)时,都会调用方法notification

@objc func playerEndedPlaying(_ notification: Notification) {
    DispatchQueue.main.async {[weak self] in
        if let playerItem = notification.object as? AVPlayerItem {
            self?.player?.remove(playerItem)
            playerItem.seek(to: .zero, completionHandler: nil)
            self?.player?.insert(playerItem, after: nil)
            if playerItem == self?.playerItems?.last {
                self?.pauseVideo()
            }
        }
    }
}

每次playerItem中的AVQueuePlayer结束播放时,都会调用上述方法。

  1. AVQueuePlayer's insert(_:after:)在每个playerItem附加到queue的地方被调用。
  

afterItem

     

新插入的播放器项目应包含的播放器项目   按照队列。传递nil将该项目附加到队列中。

  1. 使用playerItem == self?.playerItems?.last标识循环。您可以在此处添加自定义处理。我paused player一次videos都结束了演奏。