2012-06-22 11 views
7

Мне нужно создать что-то вроде бесконечного цикла в моем AVQueuePlayer. В частности, я хочу воспроизвести весь NSArray из AVPlayerItem s, как только последний компонент закончит игру.Повторить элементы в AVQueuePlayer после последнего

Должен признаться, что на самом деле я понятия не имею, как достичь этого и надеюсь, что вы можете дать мне некоторые подсказки.

+0

Вы застряли на этом этапе или вам просто нужно создать его из начальной точки? – Dhruv

+0

Я на самом деле теперь, как создать его и воспроизвести все AVQueuePlayers, теперь я ищу перезагрузить плеер, когда последний QVPlayerItem сделан. – Edelweiss

+0

'- (void) playVideoAtIndex: (NSInteger) index { [self performSelector: @selector (setObservationInfo)]; currentIndex = index; AVPlayerItem * videoItem = [AVPlayerItem playerItemWithURL: [NSURL файлURLWithPath: [arrVideoList objectAtIndex: index]]]; } ' , где вам нужно проверить, ' если (currentIndex <[число arrVideoList] -1) { currentIndex ++; } прочее { currentIndex = 0; } [self playVideoAtIndex: currentIndex]; ' – Dhruv

ответ

1

Это в значительной степени с нуля. Компоненты:

  1. Создайте очередь NSArray из элементов AVPlayerItems.
  2. Поскольку каждый элемент добавляется в очередь, настройте наблюдателя NSNotificationCenter, чтобы он проснулся, когда видео достигнет конца.
  3. В селекторе наблюдателя скажите элементу AVPlayerItem, что вы хотите, чтобы вернуться к началу, а затем попросите игрока сыграть.

(Примечание: AVPlayerDemoPlaybackView происходит от Apple "AVPlayerDemo" образец Просто подкласс UIView с легавой.)

BOOL videoShouldLoop = YES; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSMutableArray *videoQueue = [[NSMutableArray alloc] init]; 
AVQueuePlayer *mPlayer; 
AVPlayerDemoPlaybackView *mPlaybackView; 

// You'll need to get an array of the files you want to queue as NSARrray *fileList: 
for (NSString *videoPath in fileList) { 
    // Add all files to the queue as AVPlayerItems 
    if ([fileManager fileExistsAtPath: videoPath]) { 
     NSURL *videoURL = [NSURL fileURLWithPath: videoPath]; 
     AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL: videoURL]; 
     // Setup the observer 
     [[NSNotificationCenter defaultCenter] addObserver: self 
               selector: @selector(playerItemDidReachEnd:) 
                name: AVPlayerItemDidPlayToEndTimeNotification 
                object: playerItem]; 
     // Add the playerItem to the queue 
     [videoQueue addObject: playerItem]; 
    } 
} 
// Add the queue array to the AVQueuePlayer 
mPlayer = [AVQueuePlayer queuePlayerWithItems: videoQueue]; 
// Add the player to the view 
[mPlaybackView setPlayer: mPlayer]; 
// If you should only have one video, this allows it to stop at the end instead of blanking the display 
if ([[mPlayer items] count] == 1) { 
    mPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
} 
// Start playing 
[mPlayer play]; 


- (void) playerItemDidReachEnd: (NSNotification *)notification 
{ 
    // Loop the video 
    if (videoShouldLoop) { 
     // Get the current item 
     AVPlayerItem *playerItem = [mPlayer currentItem]; 
     // Set it back to the beginning 
     [playerItem seekToTime: kCMTimeZero]; 
     // Tell the player to do nothing when it reaches the end of the video 
     // -- It will come back to this method when it's done 
     mPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
     // Play it again, Sam 
     [mPlayer play]; 
    } else { 
     mPlayer.actionAtItemEnd = AVPlayerActionAtItemEndAdvance; 
    } 
} 

Вот оно! Дайте мне знать, что-то нуждается в дальнейшем объяснении.

+0

Что мне делать, если я добавлю добавленное 3video в плеер. И после завершения всего 3 видео последнее видео будет воспроизводиться в бесконечном цикле –

+0

Логика здесь не получает желаемого поведения OP. Он перебирает последний элемент, а не весь массив элементов плеера. – Joey

+0

Спасибо, что это сработало для меня .. –

0

Я вычислил решение, чтобы перебрать все видео в моей очереди видео, а не только одну. Сначала я инициализируюсь моим AVQueuePlayer:

- (void)viewDidLoad 
{ 
    NSMutableArray *vidItems = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < 5; i++) 
    { 
     // create file name and make path 
     NSString *fileName = [NSString stringWithFormat:@"intro%i", i]; 
     NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mov"]; 
     NSURL *movieUrl = [NSURL fileURLWithPath:path]; 
     // load url as player item 
     AVPlayerItem *item = [AVPlayerItem playerItemWithURL:movieUrl]; 
     // observe when this item ends 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(playerItemDidReachEnd:) 
                name:AVPlayerItemDidPlayToEndTimeNotification 
                object:item]; 
     // add to array 
     [vidItems addObject:item]; 


    } 
    // initialize avqueueplayer 
    _moviePlayer = [AVQueuePlayer queuePlayerWithItems:vidItems]; 
    _moviePlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

    // create layer for viewing 
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_moviePlayer]; 

    layer.frame = self.view.bounds; 
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    // add layer to uiview container 
    [_movieViewContainer.layer addSublayer:layer]; 
} 

Когда уведомление размещено

- (void)playerItemDidReachEnd:(NSNotification *)notification { 
    AVPlayerItem *p = [notification object]; 

    // keep playing the queue 
    [_moviePlayer advanceToNextItem]; 
    // if this is the last item in the queue, add the videos back in 
    if (_moviePlayer.items.count == 1) 
    { 
     // it'd be more efficient to make this a method being we're using it a second time 
     for (int i = 0; i < 5; i++) 
     { 
      NSString *fileName = [NSString stringWithFormat:@"intro%i", i]; 
      NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mov"]; 
      NSURL *movieUrl = [NSURL fileURLWithPath:path]; 

      AVPlayerItem *item = [AVPlayerItem playerItemWithURL:movieUrl]; 

      [[NSNotificationCenter defaultCenter] addObserver:self 
                selector:@selector(playerItemDidReachEnd:) 
                 name:AVPlayerItemDidPlayToEndTimeNotification 
                 object:item]; 

      // the difference from last time, we're adding the new item after the last item in our player to maintain the order 
      [_moviePlayer insertItem:item afterItem:[[_moviePlayer items] lastObject]]; 
     } 
    } 
} 
0

лучшим способом цикла последовательность видео в AVQueuePlayer.

наблюдать за каждым игроком в AVQueuePlayer.

queuePlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
for(AVPlayerItem *item in items) { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(nextVideo:) 
      name:AVPlayerItemDidPlayToEndTimeNotification 
      object:item ]; 
} 

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

-(void) nextVideo:(NSNotification*)notif { 
    AVPlayerItem *currItem = notif.userInfo[@"object"]; 
    [currItem seekToTime:kCMTimeZero]; 
    [queuePlayer advanceToNextItem]; 
    [queuePlayer insertItem:currItem afterItem:nil]; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^