«advanceToNextItem ()» не позволяет перебирать ВСЕ видео - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть автоматически воспроизводимая последовательность видеоклипов с циклическим поведением, построенная на 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
        }
    }
}

Вот мой ViewController:

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вот решение моей проблемы (спасибо @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
    }
}
0 голосов
/ 07 ноября 2018

Вы всегда получаете доступ к первому видео здесь:

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

число всегда равно нулю. Сохраните его как члена класса и обновите его там, где это необходимо.

...