“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