"advanceToNextItem()" не позволяет перебирать ВСЕ видео
У меня есть автоматически воспроизводимая последовательность видеоклипов с зацикливанием 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:
2 ответа
Вы всегда получаете доступ к первому видео здесь:
var number: Int = 0
let clip = clips[number]
число всегда равно нулю. Сохраните его как члена класса и обновите его, где это необходимо.
Вот решение моей проблемы (спасибо @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
}
}