使用AVQueuePlayer跳转到之前的更好方法?

Tyl*_*ler 14 ios avqueueplayer swift avplayeritem

AVQueuePlayer在我的应用程序中使用了一个.我有两个滑动手势跳到下一个跳过以前的avplayeritems.现在要跳到下一个我只是在avqueueplayer上调用advanceToNextItem,效果很好.

然而,跳到上一个我正在删除所有项目并将它们添加回前面的前一个视频,这在跳过前几次时非常慢.我怎样才能像打电话一样加快速度advanceToNextItem

我的代码看起来像这样:

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)

}
Run Code Online (Sandbox Code Playgroud)

JAL*_*JAL 21

这似乎是AVQueuePlayer在调用时从播放队列中删除当前项目advanceToNextItem.从理论上讲,如果不重建队列,就无法恢复此项目.

你可以做的是使用一个标准AVPlayer,一个数组AVPlayerItems和一个整数索引来保持当前轨道的索引.

斯威夫特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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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()
    }
}
Run Code Online (Sandbox Code Playgroud)