使用AVQueuePlayer跳到上一个的更好方法吗? [英] Better way to do skip to previous with AVQueuePlayer?
问题描述
我在我的应用程序中使用了AVQueuePlayer
.我有两个滑动手势,可以跳到下一个和上一个avplayeritems.现在要跳到下一个,我只是在avqueueplayer上调用了AdvanceToNextItem,效果很好.
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.
但是,我跳到上一个视频时,我要删除所有项目并将它们添加回去,所以当多次跳到上一个视频时,这确实很慢.我怎样才能像调用advanceToNextItem
那样更快?
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
?
我的代码如下:
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)
}
推荐答案
在调用advanceToNextItem
时,似乎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.
您可以做的是使用标准的AVPlayer
,具有AVPlayerItems
的数组以及保留当前曲目索引的整数索引.
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.
迅速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:
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()
}
}
这篇关于使用AVQueuePlayer跳到上一个的更好方法吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!