Подтвердить что ты не робот

Перейти к предыдущему AVPlayerItem на AVQueuePlayer/Воспроизвести выбранный элемент из очереди

Я играю Tv-шоу, которое было отрезано в разных главах моего проекта, используя AVQueuePlayer. Я также хочу предложить возможность перейти к предыдущей/следующей главе или выбрать другую главу "на лету", в то время как AVQueuePlayer уже играет.

Переход к следующему элементу без проблем с advanceToNextItem, предоставляемым AVQueuePlayer, но нет ничего похожего на пропуски или воспроизведение определенного элемента из очереди.

Итак, я не совсем уверен, какой был бы лучший подход здесь:

  • Используя AVPlayer вместо AVQueuePlayer, вызовите replaceCurrentItemWithPlayerItem: в actionAtItemEnd, чтобы воспроизвести nextItem и просто используйте 'replaceCurrentItemWithPlayerItem', чтобы пользователь мог выбрать определенную главу

или

  1. реорганизовать очередь или текущего игрока, используя 'insertItem: afterItem:' и 'removeAllItems'

Дополнительная информация: Я сохраняю путь к различным видео в порядке, в котором они должны появляться в NSArray Пользователь должен перейти в определенные главы, нажав кнопки, которые представляют собой главу. Кнопки имеют теги, которые также являются индексами соответствующих видео в массиве.

Надеюсь, я смогу проясниться? Любой, кто имеет опыт в этой ситуации? Если кто-нибудь знает, где купить хороший IOS VideoPlayerFramework, который обеспечивает функциональность, я также ценю ссылку.

4b9b3361

Ответ 1

Если вы хотите, чтобы ваша программа могла воспроизводить предыдущий элемент и воспроизводить выбранный элемент из ваших элементов воспроизведения (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.

Ответ 2

Первый ответ удаляет все элементы из 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];


    }
}

Ответ 3

Следующий код позволяет вам перейти к любому элементу в вашем. Нет продвижения игрока. Легко и просто. playerItemList - ваш NSArray с объектами AVPlayerItem.

- (void)playAtIndex:(NSInteger)index
{
    [audioPlayer removeAllItems];
    AVPlayerItem* obj = [playerItemList objectAtIndex:index];
    [obj seekToTime:kCMTimeZero];
    [audioPlayer insertItem:obj afterItem:nil];
    [audioPlayer play];
}

Ответ 4

djiovann создал подкласс AVQueuePlayer, который обеспечивает именно эту функциональность.

Вы можете найти его на github.

Я еще не тестировал его, но, просматривая код, кажется, он выполнил эту работу. Кроме того, код хорошо документирован, поэтому он должен, по крайней мере, служить хорошей ссылкой для пользовательской реализации функциональности (я предлагаю использовать категорию вместо подкласса).

Ответ 5

Если вы хотите воспроизвести песню из любого индекса, используя 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 вызывается, когда вы хотите воспроизвести песню.