Better way to do skip to previous with AVQueuePlayer? Better way to do skip to previous with AVQueuePlayer? ios ios

Better way to do skip to previous with AVQueuePlayer?


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 itemsvar currentTrack = 0func 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 FB C D E F// re-insert A after next trackB C A D E FC A D E F// remove A then re-insert BC D E FC D B E FD B E F// remove B then re-insert CD E FD E C FE C F// remove C then re-insert DE FE F DF D// remove D then re-insert EFFE

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!


the replaceCurrentItemWithPlayerItem had limitation and should be avoided when possible, in Apple's document, it states "The new item must have the same compositor as the item it replaces, or have no compositor."

instead insert the playerItems one by one using a loop, just create an AVQueuePlayer would be faster:

func skipToPrevious() {    queuePlayer = AVQueuePlayer.queuePlayerWithItems(playerItem)}