可以使用AVQueuePlayer在队列顶部插入项目吗?

时间:2014-07-01 04:03:55

标签: ios avplayer avqueueplayer

假设队列已经初始化,我看到的将项添加到队列中的唯一方法是:

- (void)insertItem:(AVPlayerItem *)item afterItem:(AVPlayerItem *)afterItem

文档说Pass nil to append the item to the queue.

那么是不是可以将一个项目添加到队列的顶部?我希望能够重播先前播放的内容,而无需重新删除和重新排列所有内容。

3 个答案:

答案 0 :(得分:5)

Larme上面的评论让我思考,我实际上能够模仿我正在寻找的行为:

// pause the player since we're messing with the currently playing item
[_avQueuePlayer pause];

// get current first item
id firstItem = [_avQueuePlayer.items objectAtIndex:0];

// add new item in 2nd spot
[_avQueuePlayer insertItem:newItem afterItem:firstItem];

// remove our first item so the new item becomes first in line
[_avQueuePlayer removeItem:firstItem];

// now add the original first item back in after the newly insert item
[_avQueuePlayer insertItem:firstItem afterItem:newItem];

// continue playing again
[_avQueuePlayer play];

这很棒!我认为唯一的缺点是玩家必须再次缓冲我们删除并插入的下一个项目。但是队列中的其余项目将保持缓冲状态,这比重置整个队列要好。

答案 1 :(得分:0)

这有点容易(在 Swift 4 + 中):

avQueuePlayer.pause()

let currentItem = avQueuePlayer.currentItem!
avQueuePlayer.replaceCurrentItem(with: newItem)
avQueuePlayer.insert(newItem, after: currentItem)

avQueuePlayer.play()

答案 2 :(得分:0)

我知道这是一个老问题,但我今天又遇到了同样的问题。 Oren 的解决方案对我不起作用,所以我采用了更激进的方法。我的情况也不同,因为我在队列中只有两个项目(因此我使用 removeAll):

if let currentItem = player.currentItem {
    player.removeAllItems()
    player.insert(item, after: nil)
    player.insert(AVPlayerItem(asset: currentItem.asset), after: item)
} else {
    player.insert(item, after: nil)
}

注意:删除后再次插入相同的 currentItem 是不够的,因为之后玩家的 items() 仍然只返回 1 个项目(item),即使调用了 {{ 1}} 返回 canInsert(currentItem, after: item)