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()
}
}
does the queue handle more than one skip forward smoothly? if so, you could constantly re-insert the previous video back into the queue at index n+2. when the user wishes to play the previous track, you would skip forward twice.
if playing from track A to F without any skips, the pattern would look like this:
A B C D E F
B C D E F
// re-insert A after next track
B C A D E F
C A D E F
// remove A then re-insert B
C D E F
C D B E F
D B E F
// remove B then re-insert C
D E F
D E C F
E C F
// remove C then re-insert D
E F
E F D
F D
// remove D then re-insert E
F
FE
using this pattern you could only smoothly skip backwards once, but it could be modified to allow more.
definitely not an ideal solution, but may work!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With