我正在播放一个电视节目,该节目已经使用AVQueuePlayer切换到我项目的不同章节。 我还想提供跳过上一章/下一章的可能性,或者在AVQueuePlayer播放时动态选择不同的章节。
跳过下一个项目对于AVQueuePlayer提供的advanceToNextItem
没有问题,但是从队列中跳回或播放特定项目没有任何相似之处。
所以我不太确定这里最好的方法是什么:
replaceCurrentItemWithPlayerItem:
调用actionAtItemEnd
来播放nextItem并使用'replaceCurrentItemWithPlayerItem'让用户选择某个章节或
其他信息: 我按照它们应该出现在NSArray中的顺序将路径存储到不同的视频 用户应该通过按下代表章节的按钮跳转到某些章节。按钮有标签,也是数组中相应视频的索引。
希望我能说清楚自己? 有这种情况经验的人吗? 如果有人知道在哪里买一个提供功能的好的IOS VideoPlayerFramework,我也很感激这个链接。
答案 0 :(得分:22)
如果您希望您的程序可以播放上一个项目并播放您的播放项目(NSArray)中的所选项目,则可以执行此操作。
- (void)playAtIndex:(NSInteger)index
{
[player removeAllItems];
for (int i = index; i <playerItems.count; i ++) {
AVPlayerItem* obj = [playerItems objectAtIndex:i];
if ([player canInsertItem:obj afterItem:nil]) {
[obj seekToTime:kCMTimeZero];
[player insertItem:obj afterItem:nil];
}
}
}
编辑: playerItems是NSMutableArray(NSArray),用于存储AVPlayerItems。
答案 1 :(得分:3)
第一个答案从AVQueuePlayer中删除所有项目,并从作为索引arg传递的迭代开始重新填充队列。这将启动具有前一项的新填充队列(假设您传递了正确的索引)以及从该点开始的现有playerItems数组中的其余项目,但它不允许多次反转,例如你正在第10轨,并希望返回并重播赛道9,然后重播赛道5,上面你无法完成。但在这里你可以......
-(IBAction) prevSongTapped: (id) sender
{
if (globalSongCount>1){ //keep running tally of items already played
[self resetAVQueue]; //removes all items from AVQueuePlayer
for (int i = 1; i < globalSongCount-1; i++){
[audioQueuePlayer advanceToNextItem];
}
globalSongCount--;
[audioQueuePlayer play];
}
}
答案 2 :(得分:2)
以下代码允许您跳转到您的任何项目。没有球员前进。干净利落。 playerItemList是带有AVPlayerItem对象的NSArray。
- (void)playAtIndex:(NSInteger)index
{
[audioPlayer removeAllItems];
AVPlayerItem* obj = [playerItemList objectAtIndex:index];
[obj seekToTime:kCMTimeZero];
[audioPlayer insertItem:obj afterItem:nil];
[audioPlayer play];
}
答案 3 :(得分:2)
djiovann创建了一个AVQueuePlayer
的子类,它提供了这个功能。
您可以在github找到它。
我还没有对它进行测试,但是从浏览代码开始,它似乎已经完成了工作。此外,代码也有详细记录,因此它至少应该作为自定义功能实现的良好参考(我建议使用类别而不是子类化)。
答案 4 :(得分:1)
Swift 5.2
var playerItems = [AVPlayerItem]()
func play(at itemIndex: Int) {
player.removeAllItems()
for index in itemIndex...playerItems.count {
if let item = playerItems[safe: index] {
if player.canInsert(item, after: nil) {
item.seek(to: .zero, completionHandler: nil)
player.insert(item, after: nil)
}
}
}
}
答案 5 :(得分:0)
如果你想使用AVQueuePlayer从任何索引播放歌曲。那么下面的代码可以帮助你。
NSMutableArray *musicListarray (add song that you want to play in queue);
AVQueuePlayer *audioPlayer;
AVPlayerItem *item;
-(void) nextTapped
{
nowPlayingIndex = nowPlayingIndex + 1;
if (nowPlayingIndex > musicListarray.count)
{
}
else
{
[self playTrack];
}
}
-(void) playback
{
if (nowPlayingIndex < 0)
{
}
else
{
nowPlayingIndex = nowPlayingIndex - 1;
[self playTrack];
}
}
-(void) playTrack
{
@try
{
if (musicArray.count > 0)
{
item =[[AVPlayerItem alloc] initWithURL: [NSURL URLWithString:musicListarray
[nowPlayingIndex]]];
[audioPlayer replaceCurrentItemWithPlayerItem:item];
[audioPlayer play];
}
}
@catch (NSException *exception)
{
}
}
-(void) PlaySongAtIndex
{
//yore code...
nowPlayingIndex = i (stating index from queue)[audioPlayer play];
[self playTrack];
}
当您想要播放歌曲时,请在此播放PlaySongAtIndex。
答案 6 :(得分:0)
@ saiday的回答对我有用,这里是他答案的快速版本
func play(at index: Int) {
queue.removeAllItems()
for i in index..<items.count {
let obj: AVPlayerItem? = items[i]
if queue.canInsert(obj!, after: nil) {
obj?.seek(to: kCMTimeZero, completionHandler: nil)
queue.insert(obj!, after: nil)
}
}
}