I am using an AVQueuePlayer
in my app. I have a two swipe gestures to skip to next and skip to previous avplayeritems. Right now to do skip to next I am just calling advanceToNextItem on the avqueueplayer which works well.
However the skip to previous I am removing all items and adding them back in with the previous video up front, this is really slow when skipping to previous multiple times. How can I make this faster just like calling advanceToNextItem
?
My code looks like this:
func skipToPrevious() {
queuePlayer.removeAllItems()
// move the previous playerItem to the front of the list then add them all back in
for playerItem in playerItems:
queuePlayer.insertItem(playerItem, afterItem: nil)
}
It seems like AVQueuePlayer
removes the current item from the play queue when calling advanceToNextItem
. Theoretically, there is no way to get this item back without rebuilding the queue.
What you could do is use a standard AVPlayer
, have an array of AVPlayerItems
, and an integer index which keeps the index of the current track.
Swift 3:
let player = AVPlayer()
let playerItems = [AVPlayerItem]() // your array of items
var currentTrack = 0
func previousTrack() {
if currentTrack - 1 < 0 {
currentTrack = (playerItems.count - 1) < 0 ? 0 : (playerItems.count - 1)
} else {
currentTrack -= 1
}
playTrack()
}
func nextTrack() {
if currentTrack + 1 > playerItems.count {
currentTrack = 0
} else {
currentTrack += 1;
}
playTrack()
}
func playTrack() {
if playerItems.count > 0 {
player.replaceCurrentItem(with: playerItems[currentTrack])
player.play()
}
}
Swift 2.x:
func previousTrack() {
if currentTrack-- < 0 {
currentTrack = (playerItems.count - 1) < 0 ? 0 : (playerItems.count - 1)
} else {
currentTrack--
}
playTrack()
}
func nextTrack() {
if currentTrack++ > playerItems.count {
currentTrack = 0
} else {
currentTrack++;
}
playTrack()
}
func playTrack() {
if playerItems.count > 0 {
player.replaceCurrentItemWithPlayerItem(playerItems[currentTrack])
player.play()
}
}