Воспроизведение двух видео подряд без перерыва или паузы между ними в iOS 5

В моем приложении я должен сразу воспроизвести первое видео, а затем воспроизвести второе видео, которое будет повторяться. Итак, сначала я использовал MPMoviePlayerController, но между двумя видео уже был черный экран. Итак, я где-то читал, что в моем случае я должен использовать AVFoundation. Вот почему я использую AVQueuePLayer с двумя AVPLayerItem, которые я создаю с помощью своего NSURL. Но проблема в том, что после окончания первого видео идет долгая пауза. Почти за 0,5 секунды до начала второго видео. Как это удалить? Какой способ использовать? Так что я очень ценю любую помощь! Мне это очень нужно, как можно скорее. Спасибо!

Вот все мои методы, которые я использую:

- (void) configureAVPlayer {
   self.queuePlayer.actionAtItemEnd = AVPlayerActionAtItemEndPause; 

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

   self.isFirstVideoFinished = NO;

   [self playVideos];

}

- (void) playVideos {
   [self setPlayerItemsForQueue];
   [self.videoHolder setPlayer:self.queuePlayer];

}

- (void) setPlayerItemsForQueue {
NSURL *fileURL = [[NSBundle mainBundle]
                  URLForResource:[self getStringForMode:self.currentMode] withExtension:@"mp4"];

NSMutableString *secondFile = [self getStringForMode:self.currentMode];
[secondFile appendString:@"Second"];
NSURL *secondFileUrl = [[NSBundle mainBundle] URLForResource:secondFile withExtension:@"mp4"];

AVAsset *firstAsset = [AVAsset assetWithURL:fileURL];

AVPlayerItem *firstVideoItem = [AVPlayerItem playerItemWithAsset:firstAsset];//[AVPlayerItem playerItemWithURL:fileURL];

AVAsset *secondAsset = [AVAsset assetWithURL:secondFileUrl];
AVPlayerItem *secondVideoItem = [AVPlayerItem playerItemWithAsset:secondAsset];//[AVPlayerItem playerItemWithURL:secondFileUrl];

self.queuePlayer = [AVQueuePlayer queuePlayerWithItems: [NSArray arrayWithObjects:firstVideoItem, secondVideoItem,nil]];

for (AVPlayerItem *playerItem in self.queuePlayer.items) {
    [playerItem addObserver: self forKeyPath: @"status" options:0 context:NULL];
}

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                    change:(NSDictionary *)change context:(void *)context {

dispatch_async(dispatch_get_main_queue(), ^{
    if ([(AVPlayerItem *)object status] == AVPlayerItemStatusReadyToPlay) {
        [self.queuePlayer play];
    }
});

}

- (void) playerItemDidReachEnd:(NSNotification*) notification {

NSMutableString *secondFile = [self getStringForMode:self.currentMode];
[secondFile appendString:@"Second"];
NSURL *secondFileUrl = [[NSBundle mainBundle] URLForResource:secondFile withExtension:@"mp4"];
AVPlayerItem *playerItem = [[ AVPlayerItem alloc ] initWithURL:secondFileUrl];

if ([self.queuePlayer canInsertItem:playerItem afterItem:[notification object]]) {
    [self.queuePlayer insertItem: playerItem afterItem: nil ];
}

}


person Aliaksandr B.    schedule 15.03.2012    source источник


Ответы (1)


Да, несколько объектов AVPlayer — ваш лучший вариант.

Я решил эту проблему с помощью основной функции таймера, которая отслеживала текущее время воспроизведения firstVideoItem, и когда до конца оставалось 0,01 секунды, я переключал проигрыватели на альфа-канал, чтобы был виден secondVideoItem, а затем воспроизводил secondVideoItem.

Я также использовал [secondVideoItem seekToTime:CMTimeMakeWithSeconds(1,1)] перед выполнением команды воспроизведения, чтобы убедиться, что второе видео инициализировано и готово к воспроизведению. Это очень помогло.

person ben_the_builder    schedule 27.03.2012