“advanceToNextItem()”不允许循环播放所有视频

Posted

技术标签:

【中文标题】“advanceToNextItem()”不允许循环播放所有视频【英文标题】:"advanceToNextItem()" doesn't allow to loop through ALL videos 【发布时间】:2018-11-07 12:42:01 【问题描述】:

我有基于KVO 构建的具有循环行为的自动播放视频剪辑序列。但是,除了自动播放之外,我还想使用NSButton 推进所有剪辑。因此,如果我在我的序列自动播放时按下Next Video 按钮,此操作会将我推进到队列中的下一个剪辑。但它的工作方式不正确。

问题是:当队列结束时,队列中的所有剪辑都没有循环。只有第一个剪辑有一个循环(如果我按下Next Video 按钮 10 次 - 只有第一个剪辑 循环 10 次),之后所有剪辑都会正常自动播放。

问题如何(在前进时)使用 NSButton 循环播放所有视频

这是我的代码:

import Cocoa
import AVFoundation
import AVKit

class ViewController: NSViewController 

    @IBOutlet weak var avPlayerView: AVPlayerView!
    @IBOutlet weak var nextVideoButton: NSButton!
    @objc private let player = AVQueuePlayer()
    let clips = ["One", "Two", "Three", "Four"]
    private var token: NSKeyValueObservation?

    override func viewDidAppear() 
        super.viewDidAppear()
        addAllVideosToPlayer()
    

    func addAllVideosToPlayer() 
        avPlayerView.player = player
        for clip in clips 
            let urlPath = Bundle.main.path(forResource: clip, ofType: "mov")!
            let url = URL(fileURLWithPath: urlPath)
            let playerItem = AVPlayerItem(url: url)
            player.insert(playerItem, after: player.items().last)

            token = player.observe(\.currentItem)  [weak self] player, _ in
                if self!.player.items().count == 1  self?.addAllVideosToPlayer() 
            
            player.play()
            avPlayerView.controlsStyle = .none
        
    

    @IBAction func nextVideo(_ sender: Any) 
        var number: Int = 0
        let clip = clips[number]

        let urlPath = Bundle.main.path(forResource: clip, ofType: "mov")!
        let url = URL(fileURLWithPath: urlPath)
        let playerItem = AVPlayerItem(url: url)
        player.insert(playerItem, after: player.items().last)

        player.advanceToNextItem()
        number += 1

        if number >= clips.count 
            number = 0
            player.advanceToNextItem()
            number += 1
        
    

这是我的视图控制器:

【问题讨论】:

【参考方案1】:

您总是在此处访问第一个视频:

  var number: Int = 0
  let clip = clips[number]

数字始终为零。将其保留为类的成员并在需要时对其进行更新。

【讨论】:

number 在方法中本地定义。在方法返回后,这个变量被释放。 (更不用说每次调用该方法时都将其分配为零)。将其定义为类的成员,以便在方法返回后保持其值【参考方案2】:

这是我的问题的解决方案(感谢@giorashc):

class ViewController: NSViewController 

    var number: Int = 0                                         // class member

    .........................................
    .........................................

    @IBAction func nextVideo(_ sender: Any) 

        let clip = clips[number % 4]                            // modulus of 4   

        let urlPath = Bundle.main.path(forResource: clip, ofType: "mov")!
        let url = URL(fileURLWithPath: urlPath)
        let playerItem = AVPlayerItem(url: url)
        player.insert(playerItem, after: player.items().last)
        player.advanceToNextItem()
        number += 1
    

【讨论】:

以上是关于“advanceToNextItem()”不允许循环播放所有视频的主要内容,如果未能解决你的问题,请参考以下文章

Java集合 -- ListSetMap三者的区别Arraylist 与 LinkedList 区别RandomAccess接口双向链表和双向循环链表ArrayList 与 Vector

双向不循环链表

数据结构之单向不循环链表

(java实现)双向循环链表

java实现单向循环链表

循环链表基础