代码之家  ›  专栏  ›  技术社区  ›  Andy Jazz

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

  •  2
  • Andy Jazz  · 技术社区  · 6 年前

    我有自动播放序列的视频剪辑与循环行为的基础上建立 KVO . 但是,除了自动播放,我还想使用 NSButton . 所以,如果我按 Next Video 按钮当我的序列自动播放时,此操作将我推进到队列中的下一个剪辑。但这不是一个正确的方法。

    :当队列结束时,队列中的所有剪辑都没有循环。只有第一个片段有一个循环(如果我按下 按钮10次 仅第一个剪辑

    问题 : ?

    这是我的密码:

    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
            }
        }
    }
    

    这是我的ViewController:

    enter image description here

    2 回复  |  直到 6 年前
        1
  •  2
  •   giorashc    6 年前

    您始终可以在此处访问第一个视频:

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

    数字总是零。将其作为类的成员保留,并在需要时进行更新。

        2
  •  0
  •   Andy Jazz    6 年前

    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
        }
    }