【问题标题】:Play video playlist and individual video clip from playlist in Loop, AVQueuePlayer iOS Swift在循环播放列表中播放视频播放列表和单个视频剪辑,AVQueuePlayer iOS Swift
【发布时间】:2019-05-27 10:27:32
【问题描述】:

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

任何帮助都会很棒。!!

【问题讨论】:

    标签: ios swift video avplayeritem avqueueplayer


    【解决方案1】:

    要在AVQueuePlayer 中循环playerItems,您需要将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()
                }
            }
        }
    }
    

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

    1. AVQueuePlayer's insert(_:after:) 被调用,其中每个 playerItem 都附加到 queue

    后项

    新插入的播放器项目应该的播放器项目 跟随在队列中。传递 nil 以将项目附加到队列中。

    1. 使用playerItem == self?.playerItems?.last 标识循环。您可以在此处添加自定义处理。我已经 paused player 一次所有的 videos 结束播放。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多