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

播放循环播放列表中的视频播放列表和单个视频剪辑,AVQueuePlayer iOS Swift,ios,swift,video,avplayeritem,avqueueplayer,Ios,Swift,Video,Avplayeritem,Avqueueplayer,我尝试在循环中播放视频播放列表,并使用AVPlayerItem在AVQueuePlayer中播放循环中播放列表中的单个视频片段,但我无法找到解决方案,下面是我迄今为止尝试的代码 一般的 var player : AVQueuePlayer? var playerLayer: AVPlayerLayer? var playerItem: [AVPlayerItem] = [] func playAtIndex(index:Int){ for i in index ..< p

我尝试在循环中播放视频播放列表,并使用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.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()

任何帮助都将是伟大的

要在
AVQueuePlayer
中循环
playerItems
,您需要在
通知中添加一个
观察者
-
AVPlayerItemDidPlayToEndTimeNotification

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

每当触发
通知时,将调用方法
playerEndPlaying(:)

@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()
            }
        }
    }
}
每当
AVQueuePlayer
中的
playerItem
结束播放时,将调用上述方法

  • 当每个
    playerItem
    被附加到
    队列中时,调用
    AVQueuePlayer的
    插入(u:after:)
  • 后项

    新插入的玩家项应包含的玩家项 排队。传递nil以将项目附加到队列

  • 使用
    playerItem==self?.playerItems?.last
    识别循环。您可以在此处添加自定义处理。当所有
    视频
    结束播放后,我暂停了
    播放器

  • 感谢您的简短介绍,但这并不能回答我的问题。它不会在loopTry中播放播放列表删除上述代码中的
    self?.pauseVideo()
    行。它可能只播放loopAVPlayerLooper.loopingPlayerItems中的最后一个视频?
    NotificationCenter.default.addObserver(self, selector: #selector(playerEndedPlaying), name: Notification.Name("AVPlayerItemDidPlayToEndTimeNotification"), object: nil)
    
    @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()
                }
            }
        }
    }