Replay items in AVQueuePlayer after last

后端 未结 4 2115
独厮守ぢ
独厮守ぢ 2021-01-05 04:29

I need to create something like an infinite loop in my AVQueuePlayer. Especially, I want to replay the whole NSArray of AVPlayerItems

4条回答
  •  时光取名叫无心
    2021-01-05 04:53

    I figured out a solution to loop over all the videos in my video queue, not just one. First I initialized my 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];
    }
    

    When the notification is posted

    - (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]];
            }
        }
    }
    

提交回复
热议问题